freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

javassist入門(mén)手冊(cè)(參考版)

2025-06-28 21:20本頁(yè)面
  

【正文】 這些屬性可通過(guò)ClassFile, MethodInfo, 或 FieldInfo 的getA。要重新計(jì)算一個(gè)方法體的最大堆棧深度,請(qǐng)使用CodeAttribute的puteMaxStack()方法。這個(gè)值可通過(guò)Bytecode對(duì)象的getMaxStack()方法獲取。每個(gè)操作碼的8位值都定義在Opcode接口中。獲取的字節(jié)碼數(shù)組可被插入到其他代碼中。CodeAttribute ca = ()。(3)。下面是個(gè)例子: ConstPool cp = ...。 ([op])。while (()) { int index = ()。位移量等等參數(shù)會(huì)自動(dòng)調(diào)整。 int write(byte[] code, int index)將字節(jié)數(shù)組寫(xiě)入索引處 int byteAt(int index)返回索引處的無(wú)符號(hào)8位值 boolean hasNext()如果還有后續(xù)指令,返回true void begin()移動(dòng)到第一天指令 CodeIterator對(duì)象使你可以知道一個(gè)方法從頭至尾的執(zhí)行情況。 // we assume move is not overloaded.CodeAttribute ca = ()。要獲取這個(gè)對(duì)象,代碼如下: ClassFile cf = ... 。屬性的刪除也類(lèi)似,通過(guò)調(diào)用FieldInfo或MethodInfo中的getAttributes()方法獲取屬性列表并刪除之。這可以通過(guò)getFields()和getMethods()來(lái)獲取。也就是說(shuō),不同ClassFile對(duì)象中的FieldInfo,MethodInfo等等對(duì)象是不共享的。 請(qǐng)注意FieldInfo, MethodInfo和AttributeInfo 對(duì)象都和ConstPool(常量池)對(duì)象有關(guān)聯(lián)。 添加和刪除成員ClassFile提供了addField()和addMethod() 方法用于添加成員和方法(字節(jié)碼操作中構(gòu)造函數(shù)被認(rèn)為是一個(gè)方法)。 ClassFile對(duì)象也可以通過(guò)write()方法,用一個(gè)給定的輸出流寫(xiě)入到類(lèi)文件中。ClassFile cf = new ClassFile(new DataInputStream(fin))。 。 獲取ClassFile對(duì)象。 5. 字節(jié)碼操作APIJavassist還提供了直接修改類(lèi)文件的低級(jí)API。比如,常規(guī)的方式, ()調(diào)用getName()。 編譯器不能正確實(shí)現(xiàn)Java方法中的調(diào)度算法,這是由于編譯器不能明確這些方法是否方法名相同但參數(shù)列表不同。 continue和break 語(yǔ)句不支持。 內(nèi)部類(lèi)和匿名類(lèi)不支持。 除了一維數(shù)組,數(shù)組的初始化和逗號(hào)表達(dá)式都不支持。請(qǐng)參見(jiàn) 。 不支持J2SE (包括枚舉和泛型)。 限制在目前的實(shí)現(xiàn)下,Javassisct的編譯器有些和語(yǔ)言規(guī)范不相符的使用限制。 注意ClassPool中的importPackage()方法不會(huì)影響get()方法。(f)。CtField f = (public Point p。()。 要告訴編譯器在解析類(lèi)名時(shí)搜索包名,請(qǐng)使用ClassPool的importPackage() 方法。 導(dǎo)入源碼中的所有類(lèi)都必須是全限定名(包含包名)。 運(yùn)行時(shí)支持類(lèi)大多數(shù)情況下,使用Javassist修改類(lèi)不需要啟動(dòng)Javassist,但也有些字節(jié)碼生成需要Javassist運(yùn)行時(shí)的支持類(lèi)。注解是必須能通過(guò)ClassPool對(duì)象訪(fǎng)問(wèn)的。上面代碼最后打?。?name: Chiba, year: 2005因?yàn)镻oint只有Author 這一個(gè)注解,因此數(shù)組的長(zhǎng)度為1,all[0]即為Author注解對(duì)象。int year = ()。Author a = (Author)all[0]。 CtClass cc = ().get(Point)。}注解也可以這么使用: Author(name=Chiba, year=2005)public class Point { int x, y。 例如: public interface Author { String name()。 注解CtClass, CtMethod, CtField和CtConstructor均提供getAnnotations()方法來(lái)方便的獲取注解。(f)。CtField f = (public int z = 0。).結(jié)束。參數(shù)可以是任意Java表達(dá)式,只要此表達(dá)式返回類(lèi)型和參數(shù)類(lèi)型一致即可。(f, 0)。 如果新加的成員需要初始化,則代碼可以如下修改: CtClass point = ().get(Point)。(f)。 CtClass point = ().get(Point)。最后,一定要將類(lèi)修改為非抽象類(lèi),因?yàn)楫?dāng)抽象方法加入類(lèi)后,此類(lèi)就變?yōu)槌橄箢?lèi)了。 ~)。 })。 })。(n)。, cc)。, cc)。假定你想在cc所代表的類(lèi)中添加方法 m()和n(): CtClass cc = ... 。 相互調(diào)用方法對(duì)于一個(gè)方法中調(diào)用另一個(gè)還沒(méi)有在類(lèi)中實(shí)現(xiàn)的方法的方式,Javassist是不支持的(Javassist不支持方法遞歸調(diào)用)。 ~)。 })。(m)。你可以先創(chuàng)建一個(gè)抽象方法,再實(shí)現(xiàn)方法體: CtClass cc = ... 。 }請(qǐng)注意$。 }, point, this, move)。例如: CtClass point = ().get(Point)。 make()方法中的腳本可以使用除了$_之外,所有以$開(kāi)頭的特殊標(biāo)識(shí)符。(m)。CtMethod m = ( public int xmove(int dx) { x += dx。CtNewMethod和CtNewConstructor提供了一些靜態(tài)工廠方法,比如make()方法來(lái)創(chuàng)建 CtMethod或CtConstructor。如果一個(gè)新的異常對(duì)象賦予了$1,此值也會(huì)作為原始catch從句中的異常捕獲。Handler中的replace()方法將此catch部分替換為插入代碼。其他標(biāo)示符比如$w, $args和$$ 也可以使用 Handler對(duì)象代表trycatch語(yǔ)句中的catch部分。$_類(lèi)型和顯式轉(zhuǎn)換類(lèi)型一致。Cast中的replace()方法將此表達(dá)式替換為插入代碼。The other identifiers such as $w, $args and $$ are also available. 其他標(biāo)示符比如$w, $args和$$ 也可以使用 Cast對(duì)象代表顯式的類(lèi)型轉(zhuǎn)換。類(lèi)型為 boolean.$rinstanceof表達(dá)式中右邊的值$type$proceed最初instanceof表達(dá)式的名稱(chēng)。Instanceof中的replace()方法將此表達(dá)式替換為插入代碼。Instanceof對(duì)象代表instance表達(dá)式。如果數(shù)組如下創(chuàng)建 String[][] s = new String[3][]。nbsp$r創(chuàng)建數(shù)組類(lèi)型$type$proceed最初創(chuàng)建數(shù)組的名稱(chēng)其他標(biāo)示符比如$w, $args和$$ 也可以使用 例如,如果數(shù)組如下創(chuàng)建, String[][] s = new String[3][4]。NewArray中的replace()方法將創(chuàng)建的數(shù)組對(duì)象替換為插入代碼。 NewArray對(duì)象代表數(shù)組創(chuàng)建。一個(gè)新創(chuàng)建對(duì)象必須保存在這個(gè)值中amp。NewExpr中的replace()方法將創(chuàng)建對(duì)象替換為插入代碼。 NewExpr對(duì)象代表新對(duì)象的創(chuàng)建(不包括數(shù)組創(chuàng)建)。$class$type$proceed代表最初訪(fǎng)問(wèn)成員的名稱(chēng)其他標(biāo)示符比如$w, $args和$$ 也可以使用。$r如果成員是可讀的,則返回類(lèi)型保存在$r中。$_如果成員是可讀的,則值保存在$_中。$1如果成員是可寫(xiě)的,則值保存在$1中。 以 $ 開(kāi)頭的標(biāo)識(shí)符具有特殊的含義: $0訪(fǎng)問(wèn)的成員變量,等同于this。表達(dá)式中的成員訪(fǎng)問(wèn)參數(shù)會(huì)傳入ExprEditor中的edit()方法。后面需要跟帶括弧的參數(shù)列表。 因?yàn)樵跇?gòu)造函數(shù)中要么調(diào)用父類(lèi)的構(gòu)造器,要么調(diào)用類(lèi)中其他的構(gòu)造器,因此在替換代碼中需要包含一個(gè)構(gòu)造器調(diào)用,通常使用 $proceed()方法。等同于this $1, $2, ... 構(gòu)造函數(shù)中的參數(shù)$class$sig$proceed代表最初構(gòu)造器的名稱(chēng)這里構(gòu)造器調(diào)用指的是ConstructorCall對(duì)象。傳入insertBefore()方法的以$開(kāi)頭的標(biāo)示符具有特殊的含義。 ConstructorCall對(duì)象代表構(gòu)造函數(shù)中的構(gòu)造器調(diào)用,比如 this()和 super。 $proceed是個(gè)特殊語(yǔ)法而不是一個(gè)字符串。 除非方法調(diào)用的返回類(lèi)型為void,否則需要返回代表返回值的$_和$_的類(lèi)型。$1, $2, ... 方法調(diào)用參數(shù)$_方法調(diào)用返回值$r方法調(diào)用返回類(lèi)型$class$sig$type$proceed代表最初方法調(diào)用的名稱(chēng)這里方法調(diào)用指的是MethodCall對(duì)象。當(dāng)方法是靜態(tài)方法時(shí),$0 的值為0 $0方法調(diào)用的目標(biāo)對(duì)象,并不等同于this對(duì)象。MethodCall中的replace()語(yǔ)句用于在方法調(diào)用時(shí)的語(yǔ)句替換。如果instrument()搜索的方法編譯時(shí)加入了g選項(xiàng),那么replace()方法中替換的源碼還可以使用局部變量。 如果表達(dá)式是只讀的,你還可以這么寫(xiě): $_ = $proceed()。 afterstatements。如果你想在方法體之前/之后插入語(yǔ)句,可使用下述代碼: { beforestatements。 在edit()中調(diào)用參數(shù)的 replace() 方法用于替換表達(dá)式為給定的語(yǔ)句。edit()方法的參數(shù)是找到表達(dá)式的對(duì)象。 instrument()搜索整個(gè)方法體。 }這樣,move()方法的第一個(gè)參數(shù)始終為0。搜索cm對(duì)應(yīng)的方法體并將所有對(duì)類(lèi)Point的move() 調(diào)用替換為: { $1 = 0。 })。 ().equals(move)) ({ $1 = 0。( new ExprEditor() { public void edit(MethodCall m) throws CannotCompileException { if (().equals(Point) amp。 要運(yùn)行一個(gè) ExprEditor對(duì)象,請(qǐng)調(diào)用CtMethod或CtClass中的 instrument()方法。使用表達(dá)式替換源碼。用于類(lèi)型轉(zhuǎn)換$sig$type$class類(lèi)型為 Object[]$$所有的實(shí)參$cflow(...)cflow 變量$r返回類(lèi)型。Javassist會(huì)編譯給定的源碼為字節(jié)碼并替換原來(lái)的方法體。}注意插入的代碼一定要以 throw或return 語(yǔ)句結(jié)束。翻譯過(guò)來(lái)就是: try { the original method body}catch ( e) { (e)。 throw $e。CtClass etype = ().get()。在插入的代碼中,異常使用特殊變量 $e表示。$class是$0的類(lèi)型。如果是構(gòu)造函數(shù)。 $sig$sig值是 ,代表順序聲明的參數(shù)類(lèi)型。當(dāng)編譯代碼執(zhí)行結(jié)束后,原先拋出的異常會(huì)再次拋給調(diào)用者。要在方法拋出異常時(shí)執(zhí)行,insertAfter()第二個(gè)參數(shù)asFinally需要設(shè)置為true。如果返回類(lèi)型為void,則$_ 類(lèi)型是Object,$_ 返回值為null。 變量$_代表方法返回值。 $_CtMethod和CtConstructor中的insertAfter()方法用于在方法結(jié)尾插入編譯代碼。如果表達(dá)式的類(lèi)型為double。代碼如下: Integer i = ($w)5。$w$w 是個(gè)包裝類(lèi)型,被用于類(lèi)型轉(zhuǎn)換。即便返回類(lèi)型是void,下面的return語(yǔ)句依然有效: return ($r)result。是個(gè)有效的語(yǔ)句。因此,如果某個(gè)操作是對(duì)void方法的調(diào)用,則($r)返回null值。比如,如果返回類(lèi)型是int,那么($r)。如果類(lèi)型轉(zhuǎn)換的操作類(lèi)型是個(gè)原生類(lèi)型,($r)會(huì)作為普通的轉(zhuǎn)換類(lèi)型返回。$_ = ($r)result。 $r$r代表方法的返回類(lèi)型,被用于類(lèi)型轉(zhuǎn)換。 $cflow的值是和當(dāng)前線(xiàn)程中與指定方法關(guān)聯(lián)的堆棧深度。)。當(dāng)方法第一次調(diào)用時(shí),$cflow(fact)的值為0,當(dāng)方法再次調(diào)用時(shí),值就變成1。標(biāo)識(shí)符也可以包含.(點(diǎn)號(hào)),比如,就是個(gè)有效的標(biāo)識(shí)符。useCflow()方法參數(shù)是聲明$cflow變量的標(biāo)識(shí)符。}要使用$cflow,先聲明方法fact()監(jiān)控調(diào)用 $cflow: CtMethod cm = ...。 假定下面的方法代表CtMethod對(duì)象cm: int fact(int n) { if (n = 1) return n。 $cflow$cflow表示“流程控制”。如果你這么寫(xiě): exMove($$, context)那么等同于: e
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1