package Ġcom . book is life . jg sk . kotlin ._ 3 3 _ reflect _ annotation Ċ Ċ import Ġkotlin . reflect . jvm . java Field Ċ import Ġkotlin . reflect . jvm . java Getter Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠS id ney Xu Ġon Ġ 2 0 1 5 / 1 1 / 2 5 . Ċ Ġ*/ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġperson Ġ= ĠPerson () ĊĠĠĠ Ġperson . age Ġ= Ġ 2 0 ĊĊĠĠĠ Ġ// Ġ ĠClass ĠReference ĊĠĠĠ Ġval Ġclazz Ġ= ĠPerson :: class ĊĊĠĠĠ Ġ// Ġ ĠFunction ĠReference ĊĠĠĠ Ġval Ġnumbers Ġ= ĠlistOf ( 1 , Ġ 2 , Ġ 3 ) ĊĠĠĠ Ġ// Ġ Ġ( Int ) Ġ-> ĠBoolean ĊĠĠĠ Ġprintln ( numbers . filter (:: is Odd )) ĊĊĠĠĠ Ġval Ġsay Hello Ġ= ĠPerson :: say Hello ĊĠĠĠ Ġprintln ( say Hello . invoke ( person , Ġ" world ")) ĊĊĠĠĠ Ġ// Ġ ĠProperty ĠReference ĊĠĠĠ Ġprintln (:: x . get ()) ĊĠĠĠ Ġ:: x . set ( 3 ) ĊĠĠĠ Ġprintln ( x ) ĊĊĠĠĠ Ġvar Ġname Ġ= ĠPerson :: age ĊĠĠĠ Ġprintln ( name . get ( person )) ĊĊĠĠĠ Ġ// Ġ ĠConstructor ĠReferences ĊĠĠĠ Ġfactory (:: Person ) ĊĊĠĠĠ Ġval Ġbean Ġ= Ġclazz . annotations . first Ġ{ ĊĠĠĠĠĠĠĠ Ġit . annotation Class . qualified Name Ġ== ĠBean :: class . qualified Name ĊĠĠĠ Ġ} Ġas ĠBean ĊĠĠĠ Ġprintln (" name Ġis Ġ${ bean . name }") Ġ// Ġ Ġt _ person ĊĊĠĠĠ Ġval Ġproperties Ġ= Ġclazz . members ĊĠĠĠ Ġproperties . filter Ġ{ ĊĠĠĠĠĠĠĠ Ġit . annotations . isNotEmpty () ĊĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln ( it . annotations [ 0 ]. annotation Class . simple Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfunctions Ġ= Ġclazz . members ĊĠĠĠ Ġfunctions . filter Ġ{ ĊĠĠĠĠĠĠĠ Ġit . annotations . isNotEmpty () ĊĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln ( it . name ) ĊĠĠĠĠĠĠĠ Ġprintln ( it . annotations [ 0 ]. annotation Class . simple Name ) ĠĠĠ Ġ// Ġ ĠBean Method ĊĊĠĠĠĠĠĠĠ Ġval Ġbean Method Ġ= Ġit . annotations [ 0 ] Ġas ĠBean Method ĊĠĠĠĠĠĠĠ Ġprintln (" alias Ġis Ġ${ bean Method . alias }") Ġ// Ġ Ġhello ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġ ĠWith ĠJava ĠReflection ĊĠĠĠ Ġprintln ( Person :: age . java Getter ) ĊĠĠĠ Ġprintln ( Person :: age . java Field ) Ċ Ċ } Ċ Ċ var Ġx Ġ= Ġ 2 Ċ fun Ġis Odd ( x : ĠInt ) Ġ= Ġx Ġ% Ġ 2 Ġ!= Ġ 0 Ċ fun Ġfactory ( f : Ġ() Ġ-> ĠPerson ) Ġ{ ĊĠĠĠ Ġval Ġp Ġ= Ġf () Ċ } Ċ Ċ @ Bean ( name Ġ= Ġ" t _ person ") Ċ class ĠPerson Ġ{ ĊĠĠĠ Ġ@ Bean Field Ġvar Ġage : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ@ Bean Method ( alias Ġ= Ġ" true Age ") Ġget () Ġ= Ġfield ĊĊĠĠĠ Ġ@ Bean Method ( alias Ġ= Ġ" hello ") Ġfun Ġsay Hello ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" hello Ġ$ message ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Retention ( Annotation Retention . RUNTIME ) Ċ @ Target ( Annotation Target . CLASS ) Ċ @ Repeat able Ċ @ Must Be Document ed Ċ annotation Ġclass ĠBean ( val Ġname : ĠString ) Ċ Ċ @ Retention ( Annotation Retention . BINARY ) Ċ @ Target ( Annotation Target . FIELD ) Ċ annotation Ġclass ĠBean Field Ċ Ċ @ Retention ( Annotation Retention . RUNTIME ) Ċ @ Target ( Annotation Target . PROPERTY _ GET TER , ĠAnnotation Target . FUNCTION ) Ċ annotation Ġclass ĠBean Method ( val Ġalias : ĠString Ġ= Ġ"")