package Ġcom . sun y uan . click . de bounce . visitor Ċ Ċ import Ġcom . sun y uan . click . de bounce . entity . Lambda Method Entity Ċ import Ġcom . sun y uan . click . de bounce . entity . Method Entity Ċ import Ġcom . sun y uan . click . de bounce . utils .* Ċ import Ġorg . object web . asm . Class Visitor Ċ import Ġorg . object web . asm . Method Visitor Ċ import Ġorg . object web . asm . Op codes Ċ Ċ /** Ċ Ġ* Ġauthor Ġ: ĠSy 0 0 7 Ċ Ġ* Ġdate ĠĠ Ġ: Ġ 2 0 2 0 / 1 1 / 2 8 Ċ Ġ* Ġdesc ĠĠ Ġ: Ċ Ġ* Ġversion : Ġ 1 . 0 Ċ Ġ*/ Ċ class ĠClick Class Visitor ( cv : ĠClass Visitor ) Ġ: ĊĠĠĠ ĠClass Visitor ( Op codes . ASM 7 , Ġcv ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġm Owner : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Find Inject ClassName Ġ= Ġfalse ĊĊĠĠĠ Ġ// hook Ġinfo Ġcollect ĊĠĠĠ Ġprivate Ġvar Ġm Collect ClassName : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm Collect Field : ĠMutable List < String >? Ġ= Ġif Ġ( Config Util . s Debug ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutable ListOf () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġm Collect Method : ĠMutable List < String >? Ġ= Ġif Ġ( Config Util . s Debug ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutable ListOf () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( ĊĠĠĠĠĠĠĠ Ġversion : ĠInt , ĊĠĠĠĠĠĠĠ Ġaccess : ĠInt , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġsignature : ĠString ?, ĊĠĠĠĠĠĠĠ Ġsuper Name : ĠString ?, ĊĠĠĠĠĠĠĠ Ġinterfaces : ĠArray < out ĠString >? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ== ĠConfig Util . s Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Find Inject ClassName Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcollect Default Methods Ġ= ĠMethod Util . s Collect Default Methods [ name ] ĊĠĠĠĠĠĠĠ Ġval Ġlambda Method Entity List Ġ= ĠMethod Util . s Collect Lambda Methods [ name ] ĊĠĠĠĠĠĠĠ Ġif Ġ(! Collection Util . isEmpty ( collect Default Methods ) Ġ|| Ġ! Collection Util . isEmpty ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlambda Method Entity List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Owner Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Visit Field ( collect Default Methods , Ġlambda Method Entity List )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¸º å½ĵåīį ç±» åĪĽå»º å±ŀæĢ§ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisit Field Ġ= Ġcv . visit Field ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . ACC _ PRIVATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig Util . s FieldName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig Util . s Field Desc , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Field . visit End () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Config Util . s Debug Ġ&& Ġ( m Find Inject ClassName Ġ|| Ġm Owner Ġ!= Ġnull )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Collect ClassName Ġ= Ġ" className :${ name . replace ("/", Ġ". ") }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . visit ( version , Ġaccess , Ġname , Ġsignature , Ġsuper Name , Ġinterfaces ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Visit Field ( ĊĠĠĠĠĠĠĠ Ġcollect Default Methods : ĠMap < String , ĠMethod Entity > ?, ĊĠĠĠĠĠĠĠ Ġlambda Methods : ĠMap < String , ĠLambda Method Entity >? ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ! Collection Util . isEmpty ( collect Default Methods ) Ġ|| Ġkotlin . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlambda Methods ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . value . tag Ġ== ĠOp codes . H _ INV OK ES PE CIAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Method ( ĊĠĠĠĠĠĠĠ Ġaccess : ĠInt , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġdesc : ĠString , ĊĠĠĠĠĠĠĠ Ġsignature : ĠString ?, ĊĠĠĠĠĠĠĠ Ġexceptions : ĠArray < out ĠString >? ĊĠĠĠ Ġ): ĠMethod Visitor Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Find Inject ClassName Ġ&& Ġname Ġ== Ġ"< cl init >") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Collect Field ?. add ("${ Config Util . s Is Debug FieldName } Ġmodified Ġto Ġ${ Config Util . s Debug }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Collect Field ?. add ("${ Config Util . s De bounce Check Time FieldName } Ġmodified Ġto Ġ${ Config Util . s De bounce Check Time }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Visitor Ġ= Ġcv . visit Method ( access , Ġname , Ġdesc , Ġsignature , Ġexceptions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDouble Check Cl init Visitor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig Util . s Debug , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig Util . s De bounce Check Time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Visitor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġm Owner Ġ?: Ġreturn Ġsuper . visit Method ( access , Ġname , Ġdesc , Ġsignature , Ġexceptions ) ĊĠĠĠĠĠĠĠ Ġ// å¤ĦçĲĨ éľĢè¦ģ Hook çļĦ Lambda æĸ¹æ³ķ ĊĠĠĠĠĠĠĠ Ġval Ġlambda Method Entity List Ġ= ĠMethod Util . s Collect Lambda Methods [ owner ] ĊĠĠĠĠĠĠĠ Ġlambda Method Entity List ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġ== Ġit . value . methodName Ġ&& Ġdesc Ġ== Ġit . value . method Desc ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( it . value . tag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . H _ IN VOKE STATIC Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// non - instance - capt uring Ġlamb das ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Collect Method ?. add ( name Ġ+ Ġdesc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Visitor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcv . visit Method ( access , Ġname , Ġdesc , Ġsignature , Ġexceptions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLambda Static Click Method Visitor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Visitor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdesc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp codes . H _ INV OK ES PE CIAL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// instance - capt uring Ġlambda ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Collect Method ?. add ( name Ġ+ Ġdesc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Visitor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcv . visit Method ( access , Ġname , Ġdesc , Ġsignature , Ġexceptions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClick Method Visitor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Visitor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdesc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . warning ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" An Ġunknown Ġ'% s ' Ġlambda Ġwas Ġcaptured Ġin Ġ'% s '. ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . methodName Ġ+ Ġit . value . method Desc , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Method ( access , Ġname , Ġdesc , Ġsignature , Ġexceptions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// å¤ĦçĲĨ åħ¶ä»ĸ éľĢè¦ģ Hook çļĦæĸ¹æ³ķ ĊĠĠĠĠĠĠĠ Ġval Ġcollect Default Methods Ġ= ĠMethod Util . s Collect Default Methods [ m Owner ] ĊĠĠĠĠĠĠĠ Ġif Ġ( Collection Util . isEmpty ( collect Default Methods )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . visit Method ( access , Ġname , Ġdesc , Ġsignature , Ġexceptions ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmethod Entity Ġ= Ġcollect Default Methods ! ![ name Ġ+ Ġdesc ] ĊĠĠĠĠĠĠĠ Ġif Ġ( method Entity Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Collect Method ?. add ( name Ġ+ Ġdesc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Visitor Ġ= Ġcv . visit Method ( access , Ġname , Ġdesc , Ġsignature , Ġexceptions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠClick Method Visitor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Visitor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdesc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . visit Method ( access , Ġname , Ġdesc , Ġsignature , Ġexceptions ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġvisit End () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . visit End () ĊĠĠĠĠĠĠĠ ĠLog Util . println Hook Info ( m Collect ClassName , Ġm Collect Field , Ġm Collect Method ) ĊĠĠĠ Ġ} Ċ }