package Ġcom . eni hs you . rpc . server Ċ Ċ import Ġcom . eni hs you . rpc . core . Json Rpc Method Ċ import Ġcom . eni hs you . rpc . core . Json Rpc Service Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Function Ċ import Ġkotlin . reflect . K Visibility Ċ import Ġkotlin . reflect . full . member Functions Ċ import Ġkotlin . reflect . jvm . is Accessible Ċ Ċ object ĠReflection s Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( this :: class . java ) ĊĠĠĠ Ġ/** ä»İ ç»Ļ å®ļçļĦ [ annotations ] ä¸Ń å¯ » æī¾ ç¬¦åĲĪ [ clazz ] çļĦ æ³¨è§£ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġannotations Ġ å¯ » æī¾ çļĦ æ³¨è§£ éĽĨåĲĪ ĊĠĠĠĠ Ġ* Ġ@ param Ġclazz ĠéľĢè¦ģ å¯ » æī¾ çļĦ çĽ®æłĩ ĊĠĠĠĠ Ġ* Ġ@ param ĠT Ġ ç¼ĸè¯ĳ æĹ¶çļĦ æ³¨è§£ ç±»åŀĭ */ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAnnotation > Ġget Annotation ( annotations : ĠIterable < Annotation >, Ġclazz : ĠK Class < T >): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġannotations . first OrNull Ġ{ Ġit . annotation Class Ġ== Ġclazz Ġ} Ġas ĠT ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ä¸º ä»¥ åĲİçļĦ RPC å¤ĦçĲĨ èİ·åıĸ [ Class Metadata ] ĊĠĠĠĠ Ġ* Ġæ Ĳ ľç´¢ ç±» ä¸ŃçļĦ æ¯ıä¸ª æłĩè®° ä¸º ` public ` çļĦ åĩ½æķ° ï¼Į æŀĦå»º åħ³äºİ åĩ½æķ° åĴĮ å®ĥçļĦ åıĤæķ° çļĦ åħĥ ä¿¡æģ¯ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġclazz ĠéľĢè¦ģ æŀĦå»º çļĦ ç±» ĊĠĠĠĠ Ġ* Ġ@ return Ġæ » ¡ è¶³ ` JSON - RPC ` æłĩåĩĨ çļĦ ç±»çļĦ åħĥ ä¿¡æģ¯ */ ĊĠĠĠ Ġfun ĠgetClass Metadata ( clazz : ĠK Class < *> ): ĠClass Metadata Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethod Metadata Ġ= Ġmutable Map Of < String , ĠMethod Metadata >() ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Get ĠClass Metadata Ġfor Ġ{}", Ġclazz . qualified Name ) ĊĠĠĠĠĠĠĠ Ġ/* åĮħåĲ« è¶ħ ç±» åľ¨ åĨħ çļĦ non - extension Ġnon - static åĩ½æķ° */ ĊĠĠĠĠĠĠĠ Ġclazz . member Functions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* æ£ĢæŁ¥ åĩ½æķ° æĺ¯åĲ¦ ä¸º public */ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . visibility Ġ!= ĠK Visibility . PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace ("{} # {} ä¸įæĺ¯ PUBLIC ï¼Į è·³ è¿ĩ ", Ġclazz . simple Name , Ġit . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ Ġreturn @ forEach Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* æ£ĢæŁ¥ åĩ½æķ° æĺ¯åĲ¦ å¸¦ æľī [ Json Rpc Method ] æ³¨è§£ */ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrpc Function Ġ= Ġget Annotation ( it . annotations , ĠJson Rpc Method :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġlogger . trace ("{} # {} Ġdidn 't Ġuse ĠJson Rpc Method Ġannotation , Ġskip ", Ġclazz . simple Name , Ġit . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ Ġreturn @ forEach Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* èİ·åıĸ åĩ½æķ° åĲį åĴĮ åıĤæķ° åĪĹè¡¨ */ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrpc FunctionName Ġ= Ġif Ġ( rpc Function . value . isNotBlank ()) Ġrpc Function . value Ġelse Ġit . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrpc Function Params Ġ= Ġget Function Parameters ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ä¿ĿåŃĺ åĪ° åı¯ è°ĥçĶ¨ åĪĹè¡¨ ä¸Ń */ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Metadata [ rpc FunctionName ] Ġ= ĠMethod Metadata ( rpc FunctionName , Ġit , Ġrpc Function Params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġlogger . debug (" Add Ġ{} Ġto Ġ{} ĠRPC Ġlist , Ġparams : Ġ{}", Ġit . name , Ġclazz . simple Name , Ġit . parameters ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġis Service Ġ= Ġget Annotation ( clazz . annotations , ĠJson Rpc Service :: class ) Ġ!= Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn ĠClass Metadata ( is Service , Ġmethod Metadata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** èİ·åıĸ åħ³äºİ åĩ½æķ° [ function ] çļĦåıĤæķ° çļĦ åħĥ ä¿¡æģ¯ */ ĊĠĠĠ Ġprivate Ġfun Ġget Function Parameters ( function : ĠK Function < *> ): ĠMap < String , ĠParameter Metadata > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparameters Metadata Ġ= Ġmutable Map Of < String , ĠParameter Metadata >() ĊĊĠĠĠĠĠĠĠ Ġfunction . parameters . forEach Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrpc ParameterName Ġ= Ġit . name Ġ?: Ġit . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrpc ParameterType Ġ= Ġit . type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrpc Parameter Kind Ġ= Ġit . kind ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Metadata [ rpc ParameterName ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter Metadata ( rpc ParameterName , Ġrpc ParameterType , Ġrpc Parameter Kind , Ġit . index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġparameters Metadata ĊĠĠĠ Ġ} Ċ } Ċ