/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 ĠJ ared ĠR um ml er Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" Spell Checking Inspection ") Ċ Ċ package Ġxyz . apr ild own . theme . utils Ċ Ċ import Ġjava . lang . reflect . Accessible Object Ċ import Ġjava . lang . reflect . Field Ċ import Ġjava . lang . reflect . Method Ċ Ċ /** Ċ Ġ* ĠContains Ġhelper Ġmethods Ġto Ġget / set Ġfields / methods Ġvia Ġreflection Ċ Ġ*/ Ċ internal Ġclass ĠReflection Ġprivate Ġconstructor () Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" no Ġinstances ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCACHE Ġ= Ġmutable Map Of < String , ĠAccess ible Object >() ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDynamic ally Ġinvoke Ġa Ġmethod . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġobj ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ ĠThe Ġobject Ġor Ġclass Ġto Ġget Ġthe Ġmethod Ġfrom . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġname ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ ĠThe Ġname Ġof Ġthe Ġmethod Ġto Ġinvoke . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtypes ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthe Ġparameter Ġtypes Ġof Ġthe Ġrequested Ġmethod . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġargs ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthe Ġarguments Ġto Ġthe Ġmethod ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġ< T > ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthe Ġmethod 's Ġreturn Ġtype ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġresult Ġof Ġdynamically Ġinvoking Ġthis Ġmethod . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġ< T > Ġinvoke ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj : ĠAny ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtypes : ĠArray < Class <* >> Ġ= Ġempty Array (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar arg Ġargs : ĠAny ĊĠĠĠĠĠĠĠ Ġ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġget Method ( obj , Ġname , Ġ* types ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmethod . invoke ( obj , Ġ* args ) Ġas ? ĠT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGet Ġthe Ġvalue Ġfrom Ġa Ġfield Ġin Ġan Ġobject / class . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġobj ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthe Ġobject Ġor Ġclass ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġname ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthe Ġname Ġof Ġthe Ġfield ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġ< T > ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ ĠThe Ġfield 's Ġtype ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġvalue Ġof Ġthe Ġfield Ġin Ġthe Ġspecified Ġobject . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġ< T > Ġget FieldValue ( obj : ĠAny ?, Ġname : ĠString ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġget Field ( obj , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! field . is Accessible ) Ġfield . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield . get ( obj ) Ġas ? ĠT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠ Ġ/** Ċ // ĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġthe Ġfield Ġvalue Ġto Ġthe Ġspecified Ġvalue . Ċ // ĠĠĠĠĠĠĠĠ Ġ* Ċ // ĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġfield Ċ // ĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthe Ġfield Ċ // ĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġobj Ċ // ĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthe Ġobject Ġwhose Ġfield Ġshould Ġbe Ġmodified Ċ // ĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġvalue Ċ // ĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthe Ġnew Ġvalue Ġfor Ġthe Ġfield Ġof Ġ` obj ` Ġbeing Ġmodified Ċ // ĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthe Ġfield Ġwas Ġset Ġsuccessfully . Ċ // ĠĠĠĠĠĠĠĠ Ġ*/ Ċ // ĠĠĠĠĠĠĠ Ġ@ Jvm Static Ċ // ĠĠĠĠĠĠĠ Ġfun Ġset FieldValue ( field : ĠField , Ġobj : ĠAny ?, Ġvalue : ĠAny ?): ĠBoolean Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! field . is Accessible ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . is Accessible Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Modifier . is Final ( field . modifiers )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodifiers Field Ġ= ĠField :: class . java . getDeclared Field (" modifiers ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifiers Field . is Accessible Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifiers Field . setInt ( field , Ġfield . modifiers Ġand ĠModifier . FINAL . inv ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . set ( obj , Ġvalue ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGet Ġa Ġmethod Ġfrom Ġa Ġclass ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġobj ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthe Ġobject Ġor Ġclass . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġname ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthe Ġrequested Ġmethod 's Ġname ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtypes ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthe Ġparameter Ġtypes Ġof Ġthe Ġrequested Ġmethod . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġa Ġ[ Method ] Ġobject Ġwhich Ġrepresents Ġthe Ġmethod Ġmatching Ġthe Ġspecified Ġname Ġand Ġparameter Ġtypes ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget Method ( obj : ĠAny ?, Ġname : ĠString , Ġvar arg Ġtypes : ĠClass < *> ): ĠMethod ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( obj Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġcache Key ( obj , Ġname , Ġ* types ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmethod : ĠMethod ? Ġ= ĠCACHE [ key ] Ġas ? ĠMethod ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method Ġ!= Ġnull ) Ġreturn Ġmethod ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġklass : ĠClass < *> ? Ġ= Ġobj Ġas ? ĠClass < *> Ġ?: Ġobj . java Class ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( klass Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Ġ= Ġklass . getDeclared Method ( name , Ġ* types ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġklass Ġ= Ġklass . super class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod ?. let Ġ{ ĠCACHE . put ( key , Ġmethod ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmethod ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGet Ġa Ġfield Ġfrom Ġa Ġclass . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġobj ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthe Ġobject Ġor Ġclass ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġname ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġthe Ġname Ġof Ġthe Ġfield ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġa Ġ[ Field ] Ġobject Ġfor Ġthe Ġfield Ġwith Ġthe Ġgiven Ġname Ġwhich Ġis Ġdeclared Ġin Ġthe Ġclass . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget Field ( obj : ĠAny ?, Ġname : ĠString ): ĠField ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( obj Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġcache Key ( obj , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfield : ĠField ? Ġ= ĠCACHE [ key ] Ġas ? ĠField ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġnull ) Ġreturn Ġfield ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġklass : ĠClass < *> ? Ġ= Ġobj Ġas ? ĠClass < *> Ġ?: Ġobj . java Class ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġklass ?. getDeclared Field ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠNoSuch Field Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġklass Ġ= Ġklass ?. super class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( field Ġ== Ġnull Ġ&& Ġklass Ġ!= Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield ?. let Ġ{ ĠCACHE . put ( key , Ġit ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcache Key ( obj : ĠAny , Ġname : ĠString , Ġvar arg Ġtypes : ĠClass < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġklass Ġ= Ġobj Ġas ? ĠClass < *> Ġ?: Ġobj :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠStringBuilder ( klass . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey . append ('# ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey . append ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( types . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġseparator Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey . append (' (' ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtypes . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey . append ( separator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey . append ( it . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator Ġ= Ġ", Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey . append (' )') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkey . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ