package Ġcom . h azz . kotlin mvp Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . h azz . kotlin mvp . mvp . model . bean . Home Bean Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġkotlin . properties . Deleg ates Ċ import Ġkotlin . reflect . K Property Ċ Ċ class ĠBy Test Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç±»çļĦ ä»£çĲĨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// Ġ å®ļä¹ī ä¸Ģä¸ª æİ¥åı£ , åĴĮ ä¸Ģä¸ª æĸ¹æ³ķ Ġshow () ĊĠĠĠ Ġinterface ĠBase Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġshow () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ å®ļä¹ī ç±» å®ŀçİ° ĠBase Ġ æİ¥åı£ , Ġ å¹¶ å®ŀçİ° Ġshow Ġæĸ¹æ³ķ ĊĠĠĠ Ġopen Ġclass ĠBase Impl Ġ: ĠBase Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshow () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" ke vin ", Ġ" Base Impl :: show () ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ å®ļä¹ī ä»£çĲĨ ç±» å®ŀçİ° ĠBase Ġ æİ¥åı£ , Ġ æŀĦéĢł åĩ½æķ° åıĤæķ° æĺ¯ä¸Ģä¸ª ĠBase Ġå¯¹è±¡ ĊĠĠĠ Ġ// Ġby Ġ åĲİ è·Ł ĠBase Ġå¯¹è±¡ , Ġä¸į éľĢè¦ģ åĨį å®ŀçİ° Ġshow () ĊĠĠĠ Ġclass ĠBase Proxy ( base : ĠBase ) Ġ: ĠBase Ġby Ġbase Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġshow Other () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" ke vin ", Ġ" Base Impl :: show Other () ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġmain Ġæĸ¹æ³ķ ĊĠĠĠ Ġfun Ġmain Go () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbase Ġ= ĠBase Impl () ĊĠĠĠĠĠĠĠ ĠBase Proxy ( base ). show () ĊĠĠĠĠĠĠĠ ĠBase Proxy ( base ). show Other () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå±ŀæĢ§ å»¶ è¿ Ł åĬłè½½ ĊĠĠĠĠ Ġ* Ġl z ay Ġ åĲİ è·Ł çļĦ è¡¨è¾¾å¼ı ï¼Į è¡¨è¾¾å¼ı çļĦ è¿ĶåĽŀ åĢ¼ å¿ħé¡» åĴĮ å±ŀæĢ§ ç±»åŀĭ ä¸Ģèĩ´ ĊĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġprivate Ġval Ġuser : ĠUser Ġby Ġlazy Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠShare Sparse . getValue By ( Share Sparse . USER _ CLS ) Ġas ĠUser Ċ // ĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsex : ĠString ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġåı¯ è§Ĥ å¯Ł å±ŀæĢ§ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// Ġmain Ġæĸ¹æ³ķ ĊĠĠĠ Ġfun Ġmain Go 1 () Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" dddd " ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" hh hh " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ è§Ĥ å¯Ł å±ŀæĢ§ ĊĠĠĠ Ġvar Ġname : ĠString Ġby ĠDeleg ates . observable (" hello ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġk Property : ĠK Property <* >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewName : ĠString Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" ke vin ", Ġ"${ k Property . name } --- ${ old Name } -- ${ new Name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå±ŀæĢ§ éĿŀ ç©º å¼º æł¡éªĮ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġname : ĠString Ġby ĠDeleg ates . notNull () ĊĠĠĠĠĠĠĠ Ġfun Ġinit ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . name Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠUser () ĊĠĠĠĠĠĠĠ Ġ// Ġprint ( user . name ) ĊĠĠĠĠĠĠĠ Ġ// Ġuser . name Ġ-> ĠIllegalStateException ĊĠĠĠĠĠĠĠ Ġuser . init (" Car l ") ĊĠĠĠĠĠĠĠ Ġprintln ( user . name ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ èĩªå®ļä¹ī çĽĳåĲ¬ å±ŀæĢ§ åıĺåĮĸ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// èĩªå®ļä¹ī å§Ķ æīĺ å±ŀæĢ§ ĊĠĠĠ Ġclass ĠA () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ è¿Ĳç®Ĺ ç¬¦ éĩį è½½ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġprop : ĠK Property < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"$ this Ref , Ġthank Ġyou Ġfor Ġdeleg ating Ġ'${ prop . name }' Ġto Ġme !" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġprop : ĠK Property <* >, Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ value Ġhas Ġbeen Ġassigned Ġto Ġ${ prop . name } Ġin Ġ$ this Ref ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġmain Ġæĸ¹æ³ķ ĊĠĠĠ Ġfun Ġmain Go 2 () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġname : ĠString Ġby ĠA () ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" aaaa " ĊĠĠĠĠĠĠĠ ĠLog . e (" ke vin ", Ġname ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Describe : å¼± å¼ķçĶ¨ å°ģè£ħ ç±» Ġ- kotlin ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ å¼± å¼ķçĶ¨ å¯¹è±¡ å¤ĦçĲĨ ï¼Į éĺ² æŃ¢ ç§»åĬ¨ ç«¯ åĨħåŃĺ æ³ Ħ éľ ² ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠWeak < T Ġ: ĠAny >( initializer : Ġ() Ġ-> ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġweak Reference Ġ= ĠWeak Reference < T ? >( initializer ()) ĊĊĠĠĠĠĠĠĠ Ġconstructor () Ġ: Ġthis ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġweak Reference . get () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweak Reference Ġ= ĠWeak Reference ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMap åĢ¼ Ġ æĺłå°Ħ åĪ° ç±» å±ŀæĢ§ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠUser X ( map : ĠMap < String , ĠAny ?> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString Ġby Ġmap ĊĠĠĠĠĠĠĠ Ġval Ġage : ĠInt Ġby Ġmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmain 1 ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠUser X ( map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto Ġ" John ĠDoe ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" age " Ġto Ġ 1 2 3 ĊĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ Ġ// Ġkey Ġä¸į åŃĺåľ¨ æĬ¥éĶĻ Ġ ĠKey Ġage Ġis Ġmissing Ġin Ġthe Ġmap . ĊĠĠĠĠĠĠĠ Ġ// Ġ ç±»åŀĭ ä¸į ä¸Ģèĩ´ Ġjava . lang . Class CastException : Ġjava . lang . String Ġcannot Ġbe Ġcast Ġto Ġjava . lang . Number ĊĠĠĠĠĠĠĠ Ġprintln (" name Ġ= Ġ${ user . name }, Ġage Ġ= Ġ${ user . age }") ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ