package Ġcom . wang du wei . asm . source . part 7 Ċ Ċ import Ġcom . wang du wei . asm . source . utils . Class Output Util Ċ import Ġorg . object web . asm . Class Reader Ċ import Ġorg . object web . asm . Class Writer Ċ import Ġorg . object web . asm . Op codes Ċ import Ġorg . object web . asm . tree .* Ċ Ċ class ĠBean Field Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġf : Int Ġ= 1 ĊĠĠĠ Ġfun Ġget F (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset F ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . f Ġ= Ġf ĊĠĠĠĠĠĠĠ Ġthis . f Ġ= Ġvalue ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġclass Reader Ġ= ĠClass Reader (" com . wang du wei . asm . source . part 7 . Bean Field ") ĊĠĠĠ Ġval Ġclass Node Ġ= ĠClass Node () ĊĠĠĠ Ġclass Reader . accept ( class Node , ĠClass Reader . SKIP _ DEBUG ) ĊĠĠĠ Ġval Ġremove Transformer Ġ= ĠRemove GetField Put Field Transformer () ĊĠĠĠ Ġfor Ġ( method Node Ġin Ġclass Node . methods ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Transformer . transform ( method Node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġclass Writer Ġ= ĠClass Writer ( Class Writer . COMPUTE _ MAX S ) ĊĠĠĠ Ġclass Node . accept ( class Writer ) ĊĠĠĠ Ġ/* ĊĠĠĠ ĠåĪłéĻ¤ ä¹ĭåīį çļĦ åŃĹèĬĤ çłģ æĮĩä»¤ ï¼ļ ĊĠĠĠ Ġpublic Ġfinal Ġvoid Ġset F ( int ); ĊĠĠĠ Ġdescriptor : Ġ( I ) V ĊĠĠĠ Ġflags : ĠACC _ PUBLIC , ĠACC _ FINAL ĊĠĠĠ ĠCode : ĊĠĠĠĠĠ Ġstack = 2 , Ġlocals = 2 , Ġargs _ size = 2 ĊĠĠĠĠĠĠĠĠĠ 0 : Ġal o ad _ 0 ĊĠĠĠĠĠĠĠĠĠ 1 : Ġal o ad _ 0 ĊĠĠĠĠĠĠĠĠĠ 2 : Ġget field ĠĠĠĠĠ Ġ# 2 7 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠField Ġf : I ĊĠĠĠĠĠĠĠĠĠ 5 : Ġput field ĠĠĠĠĠ Ġ# 2 7 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠField Ġf : I ĊĠĠĠĠĠĠĠĠĠ 8 : Ġal o ad _ 0 ĊĠĠĠĠĠĠĠĠĠ 9 : Ġi load _ 1 ĊĠĠĠĠĠĠĠĠ 1 0 : Ġput field ĠĠĠĠĠ Ġ# 2 7 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠField Ġf : I ĊĠĠĠĠĠĠĠĠ 1 3 : Ġreturn ĊĊĠĠĠ ĠåĪłéĻ¤ åĲİçļĦ åŃĹèĬĤ çłģ æĮĩä»¤ ï¼ļ ĊĠĠĠ Ġpublic Ġfinal Ġvoid Ġset F ( int ); ĊĠĠĠ Ġdescriptor : Ġ( I ) V ĊĠĠĠ Ġflags : ĠACC _ PUBLIC , ĠACC _ FINAL ĊĠĠĠ ĠCode : ĊĠĠĠĠĠ Ġstack = 2 , Ġlocals = 2 , Ġargs _ size = 2 ĊĠĠĠĠĠĠĠĠĠ 0 : Ġal o ad _ 0 ĊĠĠĠĠĠĠĠĠĠ 1 : Ġi load _ 1 ĊĠĠĠĠĠĠĠĠĠ 2 : Ġput field ĠĠĠĠĠ Ġ# 2 7 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠField Ġf : I ĊĠĠĠĠĠĠĠĠĠ 5 : Ġreturn ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠClass Output Util . byte 2 File (" asm _ example / files / Bean Field . class ", Ġclass Writer . toByteArray ()) Ċ } Ċ Ċ /* Ċ æĪĳä»¬ åı¯ä»¥ çľĭåĪ° ï¼Į åŁºäºİ æłĳ ĠAPI ĠçļĦ ä»£çłģ æķ°éĩı è¦ģ å¤ļ ä½Ļ æł¸å¿ĥ ĠAPI ĠçļĦ æĥħåĨµ ï¼Į ä½Ĩæĺ¯ è¿Ļ ä¸¤ç§į æĸ¹å¼ı ä¹ĭéĹ´çļĦ ä¸»è¦ģ åĮº åĪ« æĺ¯ ï¼Į ä½¿çĶ¨ æłĳ ĠAPI ĠæĹ¶ ä¸įéľĢè¦ģ çĬ¶æĢģ æľº ãĢĤ Ċ å½ĵ æľī ä¸īä¸ª çģ« å¤ļä¸ª è¿ŀ ç»Ń çļĦ ĠA LOAD Ġ 0 Ġ æĮĩä»¤ æĹ¶ ï¼Į ä¸į åľ¨ æĪĲä¸º éĹ®é¢ĺ ãĢĤ Ċ Ġ*/ Ċ class ĠRemove GetField Put Field Transformer Ġ: ĠMethod Transformer () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġtransform ( mn : ĠMethod Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinsn List Ġ= Ġmn . instructions ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġinsn List . iterator () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinsn Node Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is AL O AD ( insn Node )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi 2 Ġ= ĠgetNext ( insn Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i 2 Ġ!= Ġnull Ġ&& Ġis AL O AD ( i 2 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi 3 Ġ= ĠgetNext ( i 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i 3 Ġ!= Ġnull Ġ&& Ġi 3 . opcode Ġ== ĠOp codes . GET FIELD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi 4 Ġ= ĠgetNext ( i 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i 4 Ġ!= Ġnull Ġ&& Ġi 4 . opcode Ġ== ĠOp codes . PUT FIELD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( same Field ( i 3 , Ġi 4 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . next () Ġ!= Ġi 4 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsn List . remove ( insn Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsn List . remove ( i 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsn List . remove ( i 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsn List . remove ( i 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġis AL O AD ( abstract Insn Node : ĠAbstract Insn Node ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġabstract Insn Node . opcode Ġ== ĠOp codes . AL O AD Ġ&& Ġ( abstract Insn Node Ġas ĠVar Insn Node ). ` var ` Ġ== Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġsame Field ( i Node : ĠAbstract Insn Node , Ġj Node : ĠAbstract Insn Node ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( i Node Ġas ĠField Insn Node ). name Ġ== Ġ( j Node Ġas ĠField Insn Node ). name ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠgetNext ( insn Node : ĠAbstract Insn Node ?): ĠAbstract Insn Node ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠnewNode Ġ= Ġinsn Node ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewNode Ġ= ĠnewNode ?. next ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Node Ġ!= Ġnull Ġ&& ĠnewNode Ġ! is ĠLine Number Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( new Node Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠnewNode ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠMethod Transformer Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġmethod Transformer : ĠMethod Transformer ? Ġ= Ġnull ĊĊĠĠĠ Ġopen Ġfun Ġtransform ( mn : ĠMethod Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmethod Transformer ?. transform ( mn ) ĊĠĠĠ Ġ} Ċ } Ċ