package Ġme . xx 2 bab . asm demo Ċ Ċ import Ġorg . object web . asm .* Ċ import Ġorg . object web . asm . Class Writer . COMPUTE _ MAX S Ċ import Ġorg . object web . asm . Op codes .* Ċ import Ġorg . object web . asm . commons . Ad vice Adapter Ċ import Ġjava . io . File Ċ import Ġjava . io . InputStream Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ ĠWe aver 0 2 Replace New Thread (). process () Ċ } Ċ Ċ class ĠWe aver 0 2 Replace New Thread Ġ: ĠBase We aver () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget ClassName (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Java Test 0 2 Replace New Thread . class " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Process ( inputStream : ĠInputStream ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclass Reader Ġ= ĠClass Reader ( inputStream . read Bytes ()) ĊĠĠĠĠĠĠĠ Ġval Ġclass Writer Ġ= ĠClass Writer ( COMPUTE _ MAX S ) ĊĠĠĠĠĠĠĠ Ġval Ġclass Visitor Ġ= Ġobject Ġ: ĠClass Visitor ( ASM 9 , Ġclass Writer ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtemp ClassName Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Name : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterfaces : ĠArray < out ĠString >? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit ( version , Ġaccess , Ġname , Ġsignature , Ġsuper Name , Ġinterfaces ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" visit Class Ġ$ name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp ClassName Ġ= Ġname Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Inner Class ( name : ĠString ?, Ġouter Name : ĠString ?, Ġinner Name : ĠString ?, Ġaccess : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Inner Class ( name , Ġouter Name , Ġinner Name , Ġaccess ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" visit Inner Class Ġ$ name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġthose ĠThread Ġinstance Ġwhich Ġwas Ġpassed ĠRunnable Ġor Ġover ri ded Ġrun Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshould Ġdecide Ġif Ġwe Ġwant Ġto Ġreplace Ġit Ġby Ġcheck Ġthere Ġsuper Ġclass . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġcan Ġbe Ġextended Ġto Ġall Ġanonymous Ġclass Ġuse Ġcases Ġwhich ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinherits Ġfrom Ġa Ġtarget Ġclass Ġ( check Ġ` inner Class Reader . super Name `) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġor Ġimplement Ġa Ġtarget Ġinterface Ġ( check Ġ` inner Class Reader . interfaces `). ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Class Reader Ġ= ĠClass Reader ( File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDebug Flags . temp Class Dir Ġ+ Ġname !!. split ("/ "). last () Ġ+ Ġ". class "). read Bytes ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" visit Inner Class Ġ${ inner Class Reader . super Name } Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" visit Inner Class Ġ${ inner Class Reader . interfaces . first OrNull ()} Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmethodName : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexceptions : ĠArray < out ĠString >? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠMethod Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsv Ġ= Ġsuper . visit Method ( access , ĠmethodName , Ġdescriptor , Ġsignature , Ġexceptions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠThread Replace Method Visitor ( access , Ġdescriptor , Ġsignature , Ġsv , Ġtemp ClassName , ĠmethodName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit End () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit End () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" visit End ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass Reader . accept ( class Visitor , ĠClass Reader . EXPAND _ FR AMES ) ĊĠĠĠĠĠĠĠ Ġreturn Ġclass Writer . toByteArray () ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠThread Replace Method Visitor ( ĊĠĠĠ Ġaccess : ĠInt , ĊĠĠĠ Ġdescriptor : ĠString ?, ĊĠĠĠ Ġsignature : ĠString ?, ĊĠĠĠ Ġval Ġsuper Visitor : ĠMethod Visitor , ĊĠĠĠ Ġval ĠclassName : ĠString , ĊĠĠĠ Ġval ĠmethodName : ĠString ? Ċ ) Ġ: ĠAd vice Adapter ( ASM 9 , Ġsuper Visitor , Ġaccess , ĠmethodName , Ġdescriptor ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġfound Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Type Insn ( opcode : ĠInt , Ġtype : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" visit Type Insn Ġopcode Ġ$ opcode Ġ$ NEW ") ĊĠĠĠĠĠĠĠ Ġprintln (" visit Type Insn Ġ$ type ") ĊĠĠĠĠĠĠĠ Ġif Ġ( opcode Ġ== ĠNEW Ġ&& Ġtype Ġ== Ġ" java / lang / Thread ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfound Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Visitor . visit Type Insn ( NEW , Ġ" me / xx 2 bab / asm demo / helper 0 2 / Record Thread ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . visit Type Insn ( opcode , Ġtype ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Method Insn ( ĊĠĠĠĠĠĠĠ Ġopcode : ĠInt , ĊĠĠĠĠĠĠĠ Ġowner : ĠString ?, ĊĠĠĠĠĠĠĠ ĠmethodName : ĠString ?, ĊĠĠĠĠĠĠĠ Ġdescriptor : ĠString ?, ĊĠĠĠĠĠĠĠ Ġis Interface : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" visit Method Insn Ġ$ methodName ") ĊĠĠĠĠĠĠĠ Ġif Ġ( found Ġ&& Ġopcode Ġ== ĠIN V OK ES PE CIAL Ġ&& Ġowner Ġ== Ġ" java / lang / Thread " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& ĠclassName Ġ!= Ġ" me / xx 2 bab / asm demo / helper 0 2 / Record Thread ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfound Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Visitor . visit Method Insn ( INV OK ES PE CIAL , Ġ" me / xx 2 bab / asm demo / helper 0 2 / Record Thread ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmethodName , Ġdescriptor , Ġis Interface ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . visit Method Insn ( opcode , Ġowner , ĠmethodName , Ġdescriptor , Ġis Interface ) ĊĠĠĠ Ġ} Ċ Ċ }