@ file : Suppress (" UN CHECK ED _ CAST ", Ġ" K Doc Missing Documentation ", Ġ" Public Api Implicit Type ", Ġ" unused ") Ċ Ċ package Ġcom . wu yr . dm ifier . utils Ċ Ċ import Ġcom . jetbrains . rd . util . string . println Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . io . String Writer Ċ import Ġjava . lang . reflect . Field Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . lang . reflect . Modifier Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* Ġ@ author Ġw u yr Ċ Ġ* Ġ@ github Ġhttps :// github . com / wu yr / Hook w orm For Android Ċ Ġ* Ġ@ since Ġ 2 0 2 0 - 0 9 - 1 0 Ġä¸Ĭ åįĪ 1 1 : 3 2 Ċ Ġ*/ Ċ const Ġval ĠTAG Ġ= Ġ" Reflect Util " Ċ Ċ /** Ċ Ġ* Ġ åıĳçĶŁ å¼Ĥå¸¸ æĺ¯åĲ¦ æĬĽ åĩº ï¼Ī é»ĺè®¤ ä¸į æĬĽ åĩº ï¼Į åıª æīĵåį° åłĨ æłĪ ä¿¡æģ¯ ï¼ī Ċ Ġ*/ Ċ var Ġthrow Reflect Exception : ĠBoolean Ġ= Ġtrue Ċ Ċ /** Ċ Ġ* Ġ ç»Ļ å¯¹è±¡ æĪĲåĳĺ åıĺéĩı è®¾ç½® æĸ°çļĦ åĢ¼ ï¼Ī åı¯ä»¥ ä¿®æĶ¹ final å±ŀæĢ§ ï¼Į éĿĻæĢģ çļĦ åŁºæľ¬ ç±»åŀĭ éĻ¤ å¤ĸ ï¼ī Ċ Ġ* Ċ Ġ* Ġ@ param Ġtarget Ġ çĽ®æłĩ å¯¹è±¡ Ċ Ġ* Ġ@ param ĠfieldName Ġ çĽ®æłĩ åıĺéĩı åĲį Ċ Ġ* Ġ@ param Ġvalue Ġ æĸ°çļĦ åĢ¼ Ċ Ġ* Ċ Ġ* Ġ@ return Ġtrue ä¸º æĪĲåĬŁ Ċ Ġ*/ Ċ fun ĠClass <* >. set ( target : ĠAny ?, ĠfieldName : ĠString , Ġvalue : ĠAny ?) Ġ= Ġtry Ġ{ ĊĠĠĠ Ġfind Field ( fieldName ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġis Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( is Locked ()) Ġunlock () ĊĠĠĠĠĠĠĠ Ġset ( target , Ġvalue ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġtrue Ċ } Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠ Ġif Ġ( throw Reflect Exception ) Ġthrow Ġe Ġelse Ġfalse Ċ } Ċ Ċ private Ġfun ĠField . is Locked () Ġ= Ġmodifiers Ġand ĠModifier . FINAL Ġ!= Ġ 0 Ċ Ċ private Ġfun ĠField . unlock () Ġ= Ġlet Ġ{ Ġtarget Ġ-> ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠField :: class . java . getDeclared Field (" modifiers ") ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠField :: class . java . getDeclared Field (" access Flags ") ĊĠĠĠ Ġ}. run Ġ{ ĊĠĠĠĠĠĠĠ Ġis Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġset Int ( target , Ġtarget . modifiers Ġand ĠModifier . FINAL . inv ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġèİ·åıĸ çĽ®æłĩ å¯¹è±¡çļĦ åıĺéĩı åĢ¼ Ċ Ġ* Ċ Ġ* Ġ@ param Ġtarget Ġ çĽ®æłĩ å¯¹è±¡ Ċ Ġ* Ġ@ param ĠfieldName Ġ çĽ®æłĩ åıĺéĩı åĲį Ċ Ġ* Ċ Ġ* Ġ@ return Ġ çĽ®æłĩ åıĺéĩı åĢ¼ ï¼Ī èİ·åıĸ å¤±è´¥ åĪĻ è¿ĶåĽŀ null ï¼ī Ċ Ġ*/ Ċ fun Ġ< T > ĠClass <* >. get ( target : ĠAny ?, ĠfieldName : ĠString ) Ġ= Ġtry Ġ{ ĊĠĠĠ Ġfind Field ( fieldName ). run Ġ{ ĊĠĠĠĠĠĠĠ Ġis Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġget ( target ) Ġas ? ĠT ? ĊĠĠĠ Ġ} Ċ } Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠ Ġif Ġ( throw Reflect Exception ) Ġthrow Ġe Ġelse Ġe . stack Trace String . println () ĊĠĠĠ Ġnull Ċ } Ċ Ċ /** Ċ Ġ* Ġ è°ĥçĶ¨ çĽ®æłĩ å¯¹è±¡ çļĦæĸ¹æ³ķ Ċ Ġ* Ċ Ġ* Ġ@ param Ġtarget Ġ çĽ®æłĩ å¯¹è±¡ Ċ Ġ* Ġ@ param ĠmethodName Ġ çĽ®æłĩ æĸ¹æ³ķ åĲį Ċ Ġ* Ġ@ param Ġparams Pairs ĠåıĤæķ° ç±»åŀĭ åĴĮ åıĤæķ° åĢ¼çļĦ éĶ® åĢ¼ å¯¹ ãĢĤ ç¤ºä¾ĭ ï¼ļ Ċ Ġ* Ġ< pre > Ċ Ġ* Ġ Ġval Ġview Ġ= ĠLayoutInflater :: class . invoke < View >( layout Inflater , Ġ" try Inf late Pre compiled ", Ċ Ġ* ĠĠĠĠĠ ĠInt :: class Ġto ĠR . layout . view _ test , Ċ Ġ* ĠĠĠĠĠ ĠResource :: class Ġto Ġcontext . resource , Ċ Ġ* ĠĠĠĠĠ ĠViewGroup :: class Ġto Ġroot View , Ċ Ġ* ĠĠĠĠĠ ĠBoolean :: class Ġto Ġfalse Ċ Ġ* Ġ Ġ) Ċ Ġ* Ġ</ pre > Ċ Ġ* Ċ Ġ* Ġ@ return Ġæĸ¹æ³ķ è¿ĶåĽŀ åĢ¼ Ċ Ġ*/ Ċ fun Ġ< T > ĠClass <* >. invoke ( target : ĠAny ?, ĠmethodName : ĠString , Ġvar arg Ġparams Pairs : ĠPair < K Class <* >, ĠAny ?> Ġ= Ġempty Array ()) Ġ= Ġtry Ġ{ ĊĠĠĠ Ġfind Method ( methodName , Ġ* params Pairs . map Ġ{ Ġit . first . java Ġ}. to Typed Array ()). run Ġ{ ĊĠĠĠĠĠĠĠ Ġis Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinvoke ( target , Ġ* params Pairs . map Ġ{ Ġit . second Ġ}. to Typed Array ()) Ġas ? ĠT ? ĊĠĠĠ Ġ} Ċ } Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠ Ġif Ġ( throw Reflect Exception ) Ġthrow Ġe Ġelse Ġe . stack Trace String . println () ĊĠĠĠ Ġnull Ċ } Ċ Ċ /** Ċ Ġ* Ġ åĲĮ ä¸Ĭ ï¼Į æŃ¤ ä¹ ĥ è°ĥçĶ¨ void æĸ¹æ³ķ ï¼Į åį³ æĹł è¿ĶåĽŀ åĢ¼ Ċ Ġ*/ Ċ fun ĠClass <* >. invoke Void ( target : ĠAny ?, ĠmethodName : ĠString , Ġvar arg Ġparams Pairs : ĠPair < K Class <* >, ĠAny ?> Ġ= Ġempty Array ()) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Method ( methodName , Ġ* params Pairs . map Ġ{ Ġit . first . java Ġ}. to Typed Array ()). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke ( target , Ġ* params Pairs . map Ġ{ Ġit . second Ġ}. to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( throw Reflect Exception ) Ġthrow Ġe Ġelse Ġe . stack Trace String . println () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠåĪĽå»º çĽ®æłĩ ç±» å¯¹è±¡ Ċ Ġ* Ċ Ġ* Ġ@ param Ġparams Pairs ĠåıĤæķ° ç±»åŀĭ åĴĮ åıĤæķ° åĢ¼çļĦ éĶ® åĢ¼ å¯¹ ãĢĤ ç¤ºä¾ĭ ï¼ļ Ċ Ġ* Ġ< pre > Ċ Ġ* Ġ Ġval Ġcontext Ġ= ĠContext Impl :: class . newInstance < Context >( Ċ Ġ* ĠĠĠĠĠ ĠActivity Thread :: class Ġto Ġ..., Ċ Ġ* ĠĠĠĠĠ ĠLoaded A pk :: class Ġto Ġ..., Ċ Ġ* ĠĠĠĠĠ ĠString :: class Ġto Ġ..., Ċ Ġ* ĠĠĠĠĠ ĠI Binder :: class Ġto Ġ..., Ċ Ġ* Ġ Ġ) Ċ Ġ* Ċ Ġ* Ġ Ġ@ return Ġ çĽ®æłĩ å¯¹è±¡ æĸ° å®ŀä¾ĭ Ċ Ġ*/ Ċ fun Ġ< T > ĠClass <* >. newInstance ( var arg Ġparams Pairs : ĠPair < K Class <* >, ĠAny ?> Ġ= Ġempty Array ()) Ġ= Ġtry Ġ{ ĊĠĠĠ Ġget Declared Constructor (* params Pairs . map Ġ{ Ġit . first . java Ġ}. to Typed Array ()). run Ġ{ ĊĠĠĠĠĠĠĠ Ġis Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġnew Instance (* params Pairs . map Ġ{ Ġit . second Ġ}. to Typed Array ()) Ġas ? ĠT ? ĊĠĠĠ Ġ} Ċ } Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠ Ġif Ġ( throw Reflect Exception ) Ġthrow Ġe Ġelse Ġe . stack Trace String . println () ĊĠĠĠ Ġnull Ċ } Ċ Ċ fun ĠClass <* >. find Field ( fieldName : ĠString ): ĠField Ġ{ ĊĠĠĠ Ġdeclared Fields . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . name Ġ== ĠfieldName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this Ġ== ĠAny :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠNoSuch Field Exception ( fieldName ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterfaces . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ Ġit . find Field ( fieldName ) Ġ}. get OrNull ()?. run Ġ{ Ġreturn Ġthis Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNoSuch Field Exception ( fieldName ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġreturn Ġsuperclass . find Field ( fieldName ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠClass <* >. find Method ( methodName : ĠString , Ġparameter Types : ĠArray < Class <* >> Ġ= Ġempty Array ()): ĠMethod Ġ{ ĊĠĠĠ Ġdeclared Methods . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . name Ġ== ĠmethodName Ġ&& Ġparameter Types . content Equals ( it . parameter Types )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this Ġ== ĠAny :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠNoSuch Method Exception ( parameter Types . join ToString ( prefix Ġ= Ġ"$ methodName (", Ġpostfix Ġ= Ġ") ") Ġ{ Ġit . name Ġ}) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterfaces . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ Ġit . find Method ( methodName , Ġparameter Types ) Ġ}. get OrNull ()?. run Ġ{ Ġreturn Ġthis Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNoSuch Method Exception ( parameter Types . join ToString ( prefix Ġ= Ġ"$ methodName (", Ġpostfix Ġ= Ġ") ") Ġ{ Ġit . name Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġreturn Ġsuperclass . find Method ( methodName , Ġparameter Types ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠK Class <* >. invoke ( target : ĠAny ?, ĠmethodName : ĠString , Ġvar arg Ġparams Pairs : ĠPair < K Class <* >, ĠAny ?> Ġ= Ġempty Array ()) Ġ= Ġtry Ġ{ ĊĠĠĠ Ġjava . run Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Method ( methodName , Ġ* params Pairs . map Ġ{ Ġit . first . java Ġ}. to Typed Array ()). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke ( target , Ġ* params Pairs . map Ġ{ Ġit . second Ġ}. to Typed Array ()) Ġas ? ĠT ? ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠ Ġif Ġ( throw Reflect Exception ) Ġthrow Ġe Ġelse Ġe . println () ĊĠĠĠ Ġnull Ċ } Ċ Ċ fun ĠK Class <* >. invoke Void ( target : ĠAny ?, ĠmethodName : ĠString , Ġvar arg Ġparams Pairs : ĠPair < K Class <* >, ĠAny ?> Ġ= Ġempty Array ()) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġjava . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Method ( methodName , Ġ* params Pairs . map Ġ{ Ġit . first . java Ġ}. to Typed Array ()). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke ( target , Ġ* params Pairs . map Ġ{ Ġit . second Ġ}. to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( throw Reflect Exception ) Ġthrow Ġe Ġelse Ġe . stack Trace String . println () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠK Class <* >. newInstance ( var arg Ġparams Pairs : ĠPair < K Class <* >, ĠAny ?> Ġ= Ġempty Array ()) Ġ= Ġtry Ġ{ ĊĠĠĠ Ġjava . run Ġ{ ĊĠĠĠĠĠĠĠ Ġget Declared Constructor (* params Pairs . map Ġ{ Ġit . first . java Ġ}. to Typed Array ()). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Instance (* params Pairs . map Ġ{ Ġit . second Ġ}. to Typed Array ()) Ġas ? ĠT ? ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠ Ġif Ġ( throw Reflect Exception ) Ġthrow Ġe Ġelse Ġe . stack Trace String . println () ĊĠĠĠ Ġnull Ċ } Ċ Ċ fun ĠString . set ( target : ĠAny ?, ĠfieldName : ĠString , Ġvalue : ĠAny ?) Ġ= ĊĠĠĠ ĠClass . forName ( this ). set ( target , ĠfieldName , Ġvalue ) Ċ Ċ fun Ġ< T > ĠString . get ( target : ĠAny ?, ĠfieldName : ĠString ) Ġ= ĊĠĠĠ ĠClass . forName ( this ). get < T >( target , ĠfieldName ) Ċ Ċ fun Ġ< T > ĠString . invoke ( target : ĠAny ?, ĠmethodName : ĠString , Ġvar arg Ġparams Pairs : ĠPair < K Class <* >, ĠAny ?> ) Ġ= ĊĠĠĠ ĠClass . forName ( this ). invoke < T >( target , ĠmethodName , Ġ* params Pairs ) Ċ Ċ fun ĠString . invoke Void ( target : ĠAny ?, ĠmethodName : ĠString , Ġvar arg Ġparams Pairs : ĠPair < K Class <* >, ĠAny ?> ) Ġ= ĊĠĠĠ ĠClass . forName ( this ). invoke Void ( target , ĠmethodName , Ġ* params Pairs ) Ċ Ċ fun Ġ< T > ĠString . newInstance ( var arg Ġparams Pairs : ĠPair < K Class <* >, ĠAny ?> ) Ġ= ĊĠĠĠ ĠClass . forName ( this ). newInstance < T >(* params Pairs ) Ċ Ċ fun ĠK Class <* >. set ( target : ĠAny ?, ĠfieldName : ĠString , Ġvalue : ĠAny ?) Ġ= Ġjava . set ( target , ĠfieldName , Ġvalue ) Ċ Ċ fun Ġ< T > ĠK Class <* >. get ( target : ĠAny ?, ĠfieldName : ĠString ) Ġ= Ġjava . get < T >( target , ĠfieldName ) Ċ Ċ val ĠThrowable . stack Trace String : ĠString ĊĠĠĠ Ġget () Ġ= ĠString Writer (). use Ġ{ Ġsw Ġ-> ĊĠĠĠĠĠĠĠ ĠPrintWriter ( sw ). use Ġ{ Ġpw Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint StackTrace ( pw ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpw . flush () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsw . flush () ĊĠĠĠ Ġ}. toString () Ċ Ċ fun ĠAny ?. println () Ġ= Ġprintln ( toString ())