久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

ASM2.0字節(jié)碼框架介紹

瀏覽:182日期:2024-07-19 16:47:51
內(nèi)容: 摘要:Java的特性如動(dòng)態(tài)類加載和反射使其成為動(dòng)態(tài)語(yǔ)言。然而在許多時(shí)候,反射是不夠的,而且開(kāi)發(fā)人員需要從非Java源程序中生成字節(jié)碼,如腳本語(yǔ)言Groovy和BeanShell,或者源數(shù)據(jù)如ORM配置。當(dāng)使用已經(jīng)存在的類時(shí),特別是當(dāng)沒(méi)有源程序時(shí),就需要使用一些工具來(lái)做如分析類或方法的依賴性以便生成測(cè)試度量,或者來(lái)檢查是否存在問(wèn)題或反模式。Java5中增加了一些新特性,如如注解和范型,這會(huì)影響字節(jié)碼結(jié)果因而需要字節(jié)碼處理工具特別注意以便保持良好的性能。本文會(huì)通過(guò)一個(gè)最小且最快的Java字節(jié)碼處理框架來(lái)演示。版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必保留以下作者信息和鏈接作者:Eugene Kuleshov;xMatrix(作者的blog:http://blog.matrix.org.cn/page/xMatrix)原文:http://www.onjava.com/pub/a/onjava/2005/08/17/asm3.html譯文:http://www.matrix.org.cn/resource/article/44/44220_ASM+Bytecode+Framework.html關(guān)鍵字:ASM;Bytecode;Framework框架結(jié)構(gòu)ASM字節(jié)碼處理框架是用Java開(kāi)發(fā)的而且使用基于訪問(wèn)者模式生成字節(jié)碼及驅(qū)動(dòng)類到字節(jié)碼的轉(zhuǎn)換。這允許開(kāi)發(fā)人員避免直接處理方法字節(jié)碼中的類常量池及偏移,因此為開(kāi)發(fā)人員隱藏了字節(jié)碼的復(fù)雜性并且相對(duì)于其他類似工具如BCEL, SERP, or Javassist提供了更好的性能。ASM分為幾個(gè)包更方便靈活地構(gòu)建。包結(jié)構(gòu)圖如圖1。 Figure 1. Arrangement of ASM packages·Core包提供了讀/寫(xiě)/轉(zhuǎn)換字節(jié)碼的API而且是其他包的基礎(chǔ)。這個(gè)包已經(jīng)足夠生成Java字節(jié)碼而且能夠?qū)崿F(xiàn)大部分的字節(jié)碼轉(zhuǎn)換。·Tree包提供了Java字節(jié)碼的內(nèi)存內(nèi)表示。·Analysis包為存儲(chǔ)在來(lái)自Tree包結(jié)構(gòu)中的Java方法字節(jié)碼提供了基礎(chǔ)的數(shù)據(jù)流分析和類型檢查算法。·Commons包(ASM2.0增加)提供了幾個(gè)通用的字節(jié)碼轉(zhuǎn)換和簡(jiǎn)化字節(jié)碼生成的適配器。·Util包包含幾個(gè)助手類和簡(jiǎn)單的字節(jié)碼較驗(yàn)器來(lái)方便開(kāi)發(fā)和測(cè)試。·XML包提供了與XML文件相互轉(zhuǎn)換的字節(jié)碼結(jié)構(gòu)適配器,及兼容SAX而且允許使用XSLT來(lái)定義字節(jié)碼轉(zhuǎn)換方式的適配器。后面幾節(jié)會(huì)給出ASM框架中Core包的介紹。為了更好地理解這個(gè)包的組織結(jié)構(gòu),你最好有一些在JVM規(guī)范中定義的字節(jié)碼結(jié)構(gòu)的基礎(chǔ)了解。下面是較高級(jí)別的類文件格式圖([*]標(biāo)識(shí)重復(fù)的結(jié)構(gòu)) [1]-------------------------------------------+ | Header and Constant Stack | +--------------------------------------------+ | [*] Class Attributes | [2]------------+------------------------------+ | [*] Fields | Field Name, Descriptor, etc | | +------------------------------+ | | [*] Field Attributes | [3]------------+------------------------------+ | [*] Methods | Method Name, Descriptor, etc | | +------------------------------| | | Method max stack and locals | | |------------------------------| | | [*] Method Code table | | |------------------------------| | | [*] Method Exception table | | |------------------------------| | | [*] Method Code Attributes | | +------------------------------| | | [*] Method Attributes | +-------------+------------------------------+需要注意的一些地方:·所有使用在類結(jié)構(gòu)中的描述符,字符串和其他常量都存儲(chǔ)在類文件開(kāi)始的常量堆棧中,來(lái)自其他結(jié)構(gòu)的引用是基于堆棧的序號(hào)。·每一個(gè)類必須包含頭部(包括類名,父類,接口等)和常量堆棧。而其他元素如字段列表/方法列表/屬性列表都是可選的。·每一個(gè)方法段包含相同的頭信息和最大最小局部變量數(shù)的信息,這些是用來(lái)校驗(yàn)字節(jié)碼的。對(duì)非抽象和非原生方法,還包含一個(gè)方法指令表,一個(gè)異常表及代碼屬性。此外,還可能有其他的方法屬性。·類的每一個(gè)屬性,成員/方法/方法代碼都有自己的名字,具體細(xì)節(jié)可參考JVM規(guī)范的類文件格式部分。這些屬性代表字節(jié)碼的各種信息,如源文件名/內(nèi)部類/標(biāo)識(shí)(用來(lái)存儲(chǔ)泛型)/行號(hào)/局部變量表和注解。JVM規(guī)范也允許定義自定義的屬性來(lái)包含更多的信息但標(biāo)準(zhǔn)實(shí)現(xiàn)的VM不會(huì)識(shí)別。注:Java5注解實(shí)際上已經(jīng)廢棄了那些自定義屬性,因?yàn)樽⒔庠谥髁x上允許你表達(dá)更多的東西。·方法代碼表包含JVM的指令列表。一些指令(就像異常/行號(hào)/局部變量表)使用代碼表中的偏移值并且所有這些偏移的值可能需要在指令從方法代碼表中增刪時(shí)相應(yīng)調(diào)整。如你所見(jiàn),字節(jié)碼轉(zhuǎn)換并不容易。但是,ASM框架減少了潛在的結(jié)構(gòu)復(fù)雜性并且提供簡(jiǎn)化的API允許所有字節(jié)碼信息的訪問(wèn)和復(fù)雜的轉(zhuǎn)換。基于事件的字節(jié)碼處理Core包使用推方案(類似訪問(wèn)者模式,在SAX API就使用了這種模式處理XML)來(lái)遍歷復(fù)雜的字節(jié)碼結(jié)構(gòu)。ASM定義了幾個(gè)接口,如ClassVisitor,F(xiàn)ieldVisitor,MethodVisitor和AnnotationVisitor。AnnotationVisitor是一個(gè)特殊的接口允許你表達(dá)層次的注解結(jié)構(gòu)。下面的幾幅圖顯示這些接口是如何相互交互及配合使用實(shí)現(xiàn)字節(jié)碼轉(zhuǎn)換和從字節(jié)碼獲取信息。Core包邏輯上可憐分為兩大部分:1、 字節(jié)碼生產(chǎn)者,如ClassReader或者按正確順序調(diào)用了上面的訪問(wèn)者類的方法的自定義類。2、 字節(jié)碼消費(fèi)者,如輸出器(ClassWriter, FieldWriter, MethodWriter, and AnnotationWriter),適配器(ClassAdapter and MethodAdapter)或者其他實(shí)現(xiàn)了訪問(wèn)者接口的類。圖2給出了通用生產(chǎn)者/消費(fèi)者交互過(guò)程的時(shí)序圖。Figure 2. Sequence diagram for producer-consumer interaction在這個(gè)交互過(guò)程中,客戶端應(yīng)用首先創(chuàng)建了ClassReader并調(diào)用accept()方法(以ClassVisitor實(shí)例作為參數(shù))。然后ClassReader解析類并對(duì)每一個(gè)字節(jié)碼斷發(fā)送“visit事務(wù)給ClassVisitor。對(duì)循環(huán)的上下文,如成員/方法/注解,ClassVisitor可以創(chuàng)建繼續(xù)撲克相應(yīng)接口(FieldVisitor, MethodVisitor, or AnnotationVisitor)的子訪問(wèn)者并返回給生產(chǎn)者。如果生產(chǎn)者接收到一個(gè)空值,他簡(jiǎn)單地忽略類的那部分(如在由訪問(wèn)者驅(qū)動(dòng)的“延遲加載特性時(shí)就不需要解析相應(yīng)的字節(jié)碼部分);否則相應(yīng)的子上下文事件就傳遞給子訪問(wèn)者實(shí)例。當(dāng)子上下文結(jié)束時(shí),生產(chǎn)者調(diào)用visitEnd()方法然后移到下一部分。字節(jié)碼消費(fèi)者可以通過(guò)手工傳遞事件給下一個(gè)鏈中的訪問(wèn)者或者使用來(lái)自傳遞所有訪問(wèn)方法給內(nèi)部的訪問(wèn)者的ClassAdapter/ MethodAdapter的訪問(wèn)者通過(guò)“響應(yīng)鏈模式連接起來(lái)。這些代理者一方面字節(jié)碼的消費(fèi)者方面另一方面也作為字節(jié)碼的生產(chǎn)者。他們?cè)趯?shí)現(xiàn)特定的字節(jié)碼轉(zhuǎn)換時(shí)可以修改原始的代理方式:1、 訪問(wèn)調(diào)用代理可以在刪除類成員/方法/方法指令時(shí)被忽略。2、 訪問(wèn)調(diào)用參數(shù)可以在重命名類/方法/類型時(shí)被修改。3、 新訪問(wèn)調(diào)用可以在引入新成員/方法/注入新代碼到現(xiàn)存代碼時(shí)被增加。ClassWriter訪問(wèn)者可以終結(jié)整個(gè)處理鏈,他也是最終字節(jié)碼的生成者。例如: ClassWriter cw = new ClassWriter(computeMax); ClassVisitor cc = new CheckClassAdapter(cw); ClassVisitor tv = new TraceClassVisitor(cc, new PrintWriter(System.out)); ClassVisitor cv = new TransformingClassAdapter(tv); ClassReader cr = new ClassReader(bytecode); cr.accept(cv, skipDebug); byte[] newBytecode = cw.toByteArray();在上面的代碼中,實(shí)現(xiàn)了自定義的類轉(zhuǎn)換并且將結(jié)果人作為參數(shù)傳給TraceClassVisitor的構(gòu)造函數(shù)。TraceClassVisitor打印轉(zhuǎn)換的類并傳遞給CheckClassAdapter(這是用來(lái)作簡(jiǎn)單的字節(jié)校驗(yàn)后傳遞給ClassWriter)。大部分的訪問(wèn)方法接收簡(jiǎn)單的參數(shù)如int,boolean和String。在所有的方法中String參數(shù)是字節(jié)碼中常量的引用,ASM使用與JVM一致的方式。例如,所有類名都應(yīng)該定義在內(nèi)部格式中。成員和方法描述符應(yīng)該跟JVM表示一致。泛型信息的表示也類似。這種方式避免了在沒(méi)有轉(zhuǎn)換時(shí)不必要的計(jì)算。為了便于構(gòu)建和解析這樣的描述,系統(tǒng)提供了包含一些靜態(tài)方法的Type類:·String getMethodDescriptor(Type returnType, Type[] argumentTypes)·String getInternalName(Class c)·String getDescriptor(Class c)·String getMethodDescriptor(Method m)·Type getType(String typeDescriptor)·Type getType(Class c)·Type getReturnType(String methodDescriptor)·Type getReturnType(Method m)·Type[] getArgumentTypes(String methodDescriptor)·Type[] getArgumentTypes(Method m)注意這些描述符使用了“簡(jiǎn)單表示,這意味著不包含泛型信息。泛型信息實(shí)際上作為一個(gè)單獨(dú)的字節(jié)屬性存儲(chǔ),但ASM專門對(duì)待這個(gè)屬性并且在相應(yīng)訪問(wèn)方法中傳遞泛型標(biāo)識(shí)串作為參數(shù)。這個(gè)標(biāo)識(shí)串的值也是參照J(rèn)VM規(guī)范,與Java代碼中的泛型定義唯一映射,并且為工具增加獲取額外細(xì)節(jié)的機(jī)會(huì)。ASM提供了與其他訪問(wèn)者類似的SignatureVisitor, SignatureReader, and SignatureWriter類,如圖3所示。 Figure 3. Sequence diagram for Signature classesUtil包中包含了TraceSignatureVisitor,已經(jīng)實(shí)現(xiàn)了SignatureVisitor而且可以將一個(gè)標(biāo)識(shí)值轉(zhuǎn)換成Java的泛型定義。下面的例子將一個(gè)方法標(biāo)識(shí)轉(zhuǎn)換為Java方法定義。 TraceSignatureVisitor v = new TraceSignatureVisitor(access); SignatureReader r = new SignatureReader(sign); r.accept(v); String genericDecl = v.getDeclaration(); String genericReturn = v.getReturnType(); String genericExceptions = v.getExceptions(); String methodDecl = genericReturn + ' ' + methodName + genericDecl; if(genericExceptions!=null) { methodDecl += ' throws ' + genericExceptions; }到目前為止,我們已經(jīng)討論了ASM框架的基本設(shè)計(jì)方式及類結(jié)構(gòu)處理。但最有趣的部分是ASM如何處理方法代碼。訪問(wèn)方法代碼在ASM中,方法定義是由ClassVisitor.visitMethod()來(lái)表示,剩下的方法字節(jié)碼則由MethodVisitor中的許多訪問(wèn)方法來(lái)表示。這些方法按照下面的順序來(lái)調(diào)用,“*表示重復(fù)的方法而“?表示方法只能被調(diào)用一次。此外,visit...Insn 和visitLabel方法必須按照訪問(wèn)代碼的字節(jié)碼指令順序調(diào)用,而visitTryCatchBlock, visitLocalVariable和visitLineNumber方法必須在標(biāo)簽作為參數(shù)傳遞被訪問(wèn)后才能調(diào)用。注意visitEnd方法必須在方法處理完成后被調(diào)用。雖然ClassReader已經(jīng)做了這一步,但在使用自定義字節(jié)碼生產(chǎn)者時(shí)要注意一點(diǎn)。還要注意如果一個(gè)方法包含字節(jié)碼(也就是說(shuō)方法是非抽象或非源生的),那么visitCode必須在第一個(gè)visit...Insn調(diào)用前被調(diào)用,而visitMaxs必須在最后一個(gè)visit...Insn調(diào)用后被調(diào)用。每一個(gè)visitIincInsn, visitLdcInsn, visitMultiANewArrayInsn, visitLookupSwitchInsn, and visitTableSwitchInsn方法唯一對(duì)應(yīng)一個(gè)字節(jié)碼指令。剩下的visit...Insn方法對(duì)應(yīng)多個(gè)字節(jié)碼指令,他們的操作碼作為第一個(gè)方法參數(shù)被傳入。所有這些操作碼常量被定義在Opcodes接口中。這種方式對(duì)字節(jié)碼的解析和格式化非常有效率。不幸的是,這給開(kāi)發(fā)人員生成非法代碼的可能,因?yàn)镃lassWriter不會(huì)校驗(yàn)這些限制。但是,還是有一個(gè)CheckClassAdapter可以被用來(lái)在開(kāi)發(fā)期間測(cè)試生成的代碼。另一個(gè)機(jī)會(huì)是對(duì)所有字節(jié)碼生成或轉(zhuǎn)換可以修改方法代碼的偏移并且在方法代碼中增刪額外的指令時(shí)應(yīng)該自動(dòng)調(diào)整。這對(duì)所有的跳轉(zhuǎn)偽指令的參數(shù)都兼容的,就如try-catch塊,行號(hào)和局部變量定義及一些特殊屬性一樣。但是,ASM為開(kāi)發(fā)人員隱藏了這些復(fù)雜性。為了定義方法字節(jié)碼中的位置且不需要使用絕對(duì)偏移值,需要傳遞一個(gè)唯一的標(biāo)簽類的實(shí)例給visitLabel方法。其他MethodVisitor方法如visitJumpInsn, visitLookupSwitchInsn, visitTableSwitchInsn, visitTryCatchBlock, visitLocalVariable, and visitLineNumber可以使用這些標(biāo)簽實(shí)例在visitLabel調(diào)用之前,就像實(shí)例后在方法后被調(diào)用。上面的內(nèi)容看起來(lái)很復(fù)雜,好像需要很深?yuàn)W的字節(jié)碼指令知識(shí)。但是在編譯的類上使用ASMifierClassVisitor就可以讓你知道如何用ASM生成給定的字節(jié)碼。此外,在兩個(gè)編譯的類上(一個(gè)原始的和另一個(gè)應(yīng)用特定的轉(zhuǎn)換)使用然后進(jìn)行比較就可以給出什么樣的ASM調(diào)用應(yīng)該被使用在轉(zhuǎn)換器上。這個(gè)過(guò)程在幾篇文章中已經(jīng)詳細(xì)解釋了(可以參看最后的資源部分)。目前已經(jīng)有了Eclipse使用的插件了,如圖4,提供了從Java源生成ASM代碼及比較ASMifier輸出的良好支持,還包含了上下文字節(jié)碼的參考。 Figure 4. Eclipse ASM plugin (Click on the picture to see a full-size image)用ASM的訪問(wèn)者來(lái)跟蹤類的依賴已經(jīng)有一些文章介紹了如何用ASM生成字節(jié)碼。現(xiàn)在,我們來(lái)看一下如何用ASM分析已有的類。我們來(lái)做一個(gè)有趣的應(yīng)用來(lái)獲取給定的.jar文件中使用的外部類和包。簡(jiǎn)單起見(jiàn),這個(gè)例子僅獲取外部的依賴而不會(huì)取依賴的類型(如父類/方法參數(shù)/局部變量類型等)。僅為分析,我們不會(huì)創(chuàng)建那些注解/成員/方法的子訪問(wèn)者實(shí)例。所有使用的訪問(wèn)者(包括類和標(biāo)識(shí)訪問(wèn)者)都在一個(gè)類中實(shí)現(xiàn):public class DependencyVisitor implements AnnotationVisitor, SignatureVisitor, ClassVisitor, FieldVisitor, MethodVisitor {...在這個(gè)例子中,我們會(huì)跟蹤包之間的依賴,因此私有類必須包含包名: private String getGroupKey(String name) { int n = name.lastIndexOf('/'); if(n>-1) name = name.substring(0, n); packages.add(name); return name; }為了獲取依賴關(guān)系,訪問(wèn)者接口如ClassVisitor, AnnotationVisitor, FieldVisitor, and MethodVisitor應(yīng)該選擇性地集成方法的參數(shù)。幾個(gè)常見(jiàn)的樣例如下: private void addName(String name) { if(name==null) return; String p = getGroupKey(name); if(current.containsKey(p)) { current.put(p, current.get(p)+1); } else { current.put(p, 1); } }在這個(gè)例子中,current是依賴的當(dāng)前包。另一個(gè)例子是類型描述符(注解/枚舉/成員類型/newarray指令的參數(shù)等);如Ljava/lang/String;, J, and [[[I。這些可以用Type.getType( desc)來(lái)獲取內(nèi)部格式的類名: private void addDesc(String desc) { addType(Type.getType(desc)); } private void addType(Type t) { switch(t.getSort()) { case Type.ARRAY: addType(t.getElementType()); break; case Type.OBJECT: addName(t.getClassName().replace('.','/')); break; } }在方法定義中的方法描述法及激活指令中的描述參數(shù)類型及返回類型。可以通過(guò)Type.getReturnType(methodDescriptor) 和Type.getArgumentTypes(methodDescriptor)來(lái)解析并取得參數(shù)和返回類型。 private void addMethodDesc(String desc) { addType(Type.getReturnType(desc)); Type[] types = Type.getArgumentTypes(desc); for(int i = 0; i < types.length; i++) { addType(types[ i]); } }而使用在許多“訪問(wèn)方法中的用來(lái)定義Java5泛型信息的標(biāo)識(shí)參數(shù)是個(gè)特例。如果存在,這個(gè)參數(shù)重寫(xiě)描述符參數(shù)并包含編碼后的泛型信息。可以被用SignatureReader來(lái)解析這個(gè)值。所以我們可以實(shí)現(xiàn)SignatureVisitor來(lái)被每一個(gè)標(biāo)識(shí)工件來(lái)調(diào)用。 private void addSignature(String sign) { if(sign!=null) { new SignatureReader(sign).accept(this); } } private void addTypeSignature(String sign) { if(sign!=null) { new SignatureReader(sign).acceptType(this); } }實(shí)現(xiàn)ClassVisitor接口的方法,如such as visit(), visitField(), visitMethod(), and visitAnnotation()就可以獲取在父類/接口/成員類型/方法參數(shù)/返回值/異常上的依賴信息,就如注解一樣。例如: public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { String p = getGroupKey(name); current = groups.get(p); if(current==null) { current = new HashMap(); groups.put(p, current); } if(signature==null) { addName(superName); addNames(interfaces); } else { addSignature(signature); } } public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { if(signature==null) { addDesc(desc); } else { addTypeSignature(signature); } if(value instanceof Type) { addType((Type) value); } return this; } public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { if(signature==null) { addMethodDesc(desc); } else { addSignature(signature); } addNames(exceptions); return this; } public AnnotationVisitor visitAnnotation( String desc, boolean visible) { addDesc(desc); return this; }實(shí)現(xiàn)MethodVisitor接口的方法就可以獲取關(guān)于參數(shù)注解類型和使用在可以使用對(duì)象引用的字節(jié)碼指令上的依賴: public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) { addDesc(desc); return this; } /** * Visits a type instruction * NEW, ANEWARRAY, CHECKCAST or INSTANCEOF. */ public void visitTypeInsn(int opcode, String desc) { if(desc.charAt(0)=='[') { addDesc(desc); } else { addName(desc); } } /** * Visits a field instruction * GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD. */ public void visitFieldInsn(int opcode, String owner, String name, String desc) { addName(owner); addDesc(desc); } /** * Visits a method instruction INVOKEVIRTUAL, * INVOKESPECIAL, INVOKESTATIC or * INVOKEINTERFACE. */ public void visitMethodInsn(int opcode, String owner, String name, String desc) { addName(owner); addMethodDesc(desc); } /** * Visits a LDC instruction. */ public void visitLdcInsn(Object cst) { if(cst instanceof Type) { addType((Type) cst); } } /** * Visits a MULTIANEWARRAY instruction. */ public void visitMultiANewArrayInsn( String desc, int dims) { addDesc(desc); } /** * Visits a try catch block. */ public void visitTryCatchBlock(Label start, Label end, Label handler, String type) { addName(type); }現(xiàn)在我們可以用DependencyVisitor來(lái)獲取整個(gè).jar文件的依賴關(guān)系了。例如: DependencyVisitor v = new DependencyVisitor(); ZipFile f = new ZipFile(jarName); Enumeration<? extends ZipEntry> en = f.entries(); while(en.hasMoreElements()) { ZipEntry e = en.nextElement(); String name = e.getName(); if(name.endsWith('.class')) { ClassReader cr = new ClassReader(f.getInputStream(e)); cr.accept(v, false); } }可以用很多不同的方式來(lái)表示得到的信息。一種方式是構(gòu)建依賴樹(shù)并計(jì)算相關(guān)數(shù)據(jù)或者創(chuàng)建可視化的東西。例如,圖5顯示了ant1.6.5 jar包中的依賴關(guān)系的可視化表現(xiàn),這是我使用一些簡(jiǎn)單的Java2D代碼寫(xiě)的。下面的圖在水平軸上顯示包,在垂直軸上顯示依賴。陰影部分表示包被多次引用。 Figure 5. Dependencies in ant.1.6.5.jar, as discovered with ASM這個(gè)工具的全部代碼會(huì)被包含在下一個(gè)ASM發(fā)布中。你可以從ASM CVS獲取。ASM1.x后的改變?nèi)绻銢](méi)有使用ASM1.x可以略過(guò)這個(gè)段。2.0中主要的結(jié)構(gòu)變化是所有J2SE5.0的特性都被內(nèi)建到訪問(wèn)者/過(guò)濾器的事件流中。因此新的API允許你用更輕便和自然的方式來(lái)處理泛型和注解。不需要顯式創(chuàng)建注解屬性實(shí)例,因?yàn)樵谑录髦幸呀?jīng)包含了泛型和注解數(shù)據(jù)。例如,在1.x,ClassVisitor接口如下使用: CodeVisitor visitMethod(int access, String name, String desc, String[] exceptions, Attribute attrs);This has been split into several methods in ASM 2.0:在2.0中已經(jīng)分為多個(gè)方法: MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) AnnotationVisitor visitAnnotation(String desc, boolean visible) void visitAttribute(Attribute attr)在1.x API中,為了定義泛型信息,你必須創(chuàng)建SignatureAttribute的實(shí)例,而定義注解你需要RuntimeInvisibleAnnotations, RuntimeInvisibleParameterAnnotations, RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations, and AnnotationDefault的實(shí)例。然后你可以將這些實(shí)例放在相應(yīng)的訪問(wèn)方法的attrs參數(shù)中。在2.0,增加了新的標(biāo)識(shí)參數(shù)來(lái)表示泛型信息。新的AnnotationVisitor接口被用來(lái)處理所有的注解。不再需要?jiǎng)?chuàng)建attrs集合了,而且注解數(shù)據(jù)是強(qiáng)類型的。然而在移植現(xiàn)有代碼時(shí),特別是在“適配器類被使用時(shí),必須注意確保所有來(lái)自適配器的方法需要重寫(xiě)來(lái)適應(yīng)新的標(biāo)識(shí),因?yàn)榫幾g器不用對(duì)這種情況給出警告。ASM2.0還有些其他的改變。1、增加了新的接口FieldVisitor 和AnnotationVisitor2、CodeVisitor合并到MethodVisitor中了。3、在MethodVisitor中增加了visitCode()方法簡(jiǎn)化檢測(cè)首個(gè)指令。4、Constants接口重構(gòu)為Opcodes。5、所有來(lái)自attrs包的屬性被包含到ASM的事件模型中。6、TreeClassAdapter and TreeCodeAdapter被包含到ClassNode and MethodNode中。7、增加LabelNode類使指令集合的元素成為AbstractInsnNode的通用類型。通常,建議使用如JDiff這樣的工具來(lái)比較兩個(gè)版本之間的區(qū)別。小結(jié)ASM2.0為開(kāi)發(fā)人員屏蔽了字節(jié)碼的復(fù)雜性,因而使開(kāi)發(fā)人員更有效在字節(jié)碼級(jí)別上使用Java的特性。這個(gè)框架不僅允許你轉(zhuǎn)換和生成字節(jié)碼,而且可以從現(xiàn)有的類中取得具體的信息。他的API繼續(xù)改善,現(xiàn)在已經(jīng)包含了J2SE5.0中的泛型和注解。接下來(lái),還會(huì)增加Mustang(J2SE6)中的新特性。資源·Java Virtual Machine Specification Java虛擬機(jī)規(guī)范&#8226;·'“修訂的類文件格式(JVM規(guī)范的第4章)。包含J2SE5.0中支持的JSR-14/JSR-175/JSR-201中要求的修改及其他小的更正和調(diào)整。·“使用ASM工具集來(lái)處理字節(jié)碼·“使用ASM工具集來(lái)創(chuàng)建和讀寫(xiě)J2SE5.0注解·字節(jié)碼指令(BCI)。Eugene Kuleshov是一個(gè)獨(dú)立咨詢師,擁有超過(guò)15年的軟件設(shè)計(jì)開(kāi)發(fā)經(jīng)驗(yàn)。 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd 摘要:Java的特性如動(dòng)態(tài)類加載和反射使其成為動(dòng)態(tài)語(yǔ)言。然而在許多時(shí)候,反射是不夠的,而且開(kāi)發(fā)人員需要從非Java源程序中生成字節(jié)碼,如腳本語(yǔ)言Groovy和BeanShell,或者源數(shù)據(jù)如ORM配置。當(dāng)使用已經(jīng)存在的類時(shí),特別是當(dāng)沒(méi)有源程序時(shí),就需要使用一些工具來(lái)做如分析類或方法的依賴性以便生成測(cè)試度量,?
相關(guān)文章:
主站蜘蛛池模板: 午夜影晥 | 日日摸日日碰夜夜爽不卡dvd | 日韩免费av网站 | 国产精品99久久久久久久vr | 欧美成人在线免费视频 | 国产成人av在线 | 中文字幕av一区 | 午夜午夜精品一区二区三区文 | 在线观看免费的网站www | 色999视频 | 三级特黄特色视频 | 国产欧美综合一区二区三区 | 91精品国产成人 | 97人人干 | 日韩中文视频 | 欧美精品一区二区三区在线播放 | 黄视频网站免费观看 | 亚洲第一福利视频 | 欧美日韩国产不卡 | 日韩欧美第一页 | 日本在线播放 | 成人亚洲免费 | 精品亚洲一区二区三区 | 精品在线一区 | 国产色 | 99re | 亚洲专区国产精品 | 日本 欧美 国产 | 日本久久精品 | 在线免费观看色视频 | 久久国产精品99久久久久久老狼 | 一区二区精品视频 | 亚洲综合电影 | a级毛片免费高清视频 | av中文字幕在线播放 | 日韩特级 | 日韩一区二区福利 | 欧美在线观看一区 | 精品国产一区二区在线 | 少妇一级淫片免费放 | 国产精品爱久久久久久久 | 亚洲国产一区视频 | 狠狠干狠狠干 | 亚洲欧洲无码一区二区三区 | 国产欧美日韩综合精品 | 男人天堂视频网 | 精品久久一区二区 | 色www精品视频在线观看 | 国产欧美一区二区三区在线看 | 特级毛片在线 | 日本三级中国三级99人妇网站 | 成人免费视频 | 成人免费视频视频 | 97色综合| 久久精品色欧美aⅴ一区二区 | 久久久久久久91 | 一级高清 | 久久久久国产一级毛片 | 国产成人中文字幕 | 91视频一区二区 | 九九热这里只有精品6 | 成人不卡在线观看 | 91社影院在线观看 | 国产v日产∨综合v精品视频 | 伊人久久一区二区三区 | 国产日韩精品视频 | 欧美精品一区在线 | 国产在线观看二区 | 精品国产一级毛片 | 国产激情偷乱视频一区二区三区 | 亚洲一区二区三区日韩 | 国产精品成av人在线视午夜片 | 久热精品视频 | 国产精品一区二区在线 | 久久亚洲天堂 | 欧美在线视频网 | 国产探花在线精品一区二区 | 欧美日韩成人在线 | 国产亚洲精品成人av久久影院 | 91亚洲国产成人久久精品网站 | 久久免费国产 | 国产精品久久久久久久久 | 国产综合视频在线观看 | 欧美激情精品久久久久 | 中文字幕在线不卡 | 亚洲精品成人在线 | 日韩精品免费在线视频 | 欧美激情综合色综合啪啪五月 | 午夜影院普通用户体验区 | 一区二区三区视频免费看 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 久久h | 在线色站 | 欧美激情第二页 | 美日一级毛片 | 精品护士一区二区三区 | 99爱在线观看 | 国产伊人99| 色婷婷导航| 成人av免费在线观看 | 不卡视频一区二区三区 | 在线中文字幕日韩 | 国家aaa的一级看片 操操操夜夜操 | 日韩在线观看视频免费 | 北条麻妃99精品青青久久 | 夜夜骑天天干 | 久久久男人天堂 | 五月婷婷色 | 日本黄色短片 | 中文字幕亚洲一区二区三区 | 亚色在线| 在线观看中文字幕 | 亚洲日本欧美日韩高观看 | 夜夜夜夜夜操 | 欧美久久一区二区三区 | 自拍第一页 | 欧美一区二区三 | 在线视频二区 | 91免费在线 | 精品成人在线视频 | 国产xxx在线观看 | 91精产国品一二三区在线观看 | 97成人在线免费视频 | 香港黄色录像片 | 一级免费视频 | 91电影在线 | 精品视频免费在线 | 亚洲国产精品成人 | 国产精品久久久久久 | 久久精品国产久精国产 | 亚洲精品乱码久久久久久麻豆不卡 | 日韩欧美精品一区二区三区 | 亚洲 欧美 日韩 丝袜 另类 | 欧美精品在线一区二区三区 | 国产激情偷乱视频一区二区三区 | 久久久久久国产精品 | 亚洲 欧美 自拍偷拍 | 国产区福利 | 国产性×xxx盗摄xxxx | 国产一区二区三区在线 | 亚洲精品国产9999久久久久 | 精品视频成人 | 日韩成人一区 | 国产在线精品一区二区 | 日韩av片在线免费观看 | 三级视频在线观看 | 在线日韩视频 | 亚洲精品一区中文字幕乱码 | 噜噜噜在线视频 | 天天干天天操 | 亚洲第一中文字幕 | 欧美一级性 | 欧美久久影视 | 免费一级片 | 久久精品一区二区三区四区 | 天天综合网91| 成人一区二区电影 | 黄色一级电影免费观看 | 91精品国产乱码久久久久久久久 | 婷婷综合五月 | 中文字幕在线不卡 | www在线视频 | 欧美精品在欧美一区二区少妇 | 人人插人人 | 在线观看91视频 | 精品久久久久久亚洲精品 | 久久国产精品免费一区二区三区 | 久久国产精品久久久久久 | 欧美日韩在线免费 | 亚洲精品视频在线观看网站 | 男人超碰 | 免费一级毛片 | 国产精品三级久久久久久电影 | 日韩av电影免费 | 中文精品在线 | 国产一区二区三区免费观看 | 久久亚洲美女 | 久久艹99| 国产一区二区视频在线观看 | 粉嫩高清一区二区三区精品视频 | 国产精品a免费一区久久电影 | 国产大毛片| 九九在线视频 | 一区二区精品 | 亚洲第一中文字幕 | 国产精品不卡视频 | 国产精品一区二区三区四区 | 国产免费av一区二区三区 | 青草久操| 久在线观看 | 91av官网 | 精品久久久久久久久久久院品网 | 拍真实国产伦偷精品 | 一区二区日韩精品 | 国产中文字幕在线 | 日韩在线中文字幕 | 久久精品久久久久电影 | 亚洲一区 | 韩日精品 | 永久免费网站 | 日韩中文字幕在线视频 | 依人成人综合网 | 天天操夜夜拍 | 国产 欧美 日韩 一区 | 羞羞羞网站 | 久久av一区 | 青青青久草| 国产精品成人国产乱一区 | 日本一区二区三区免费观看 | 久久成人免费观看 | 欧洲精品视频一区 | 视频一区二区中文字幕 | 亚洲一区视频在线 | 日韩在线免费 | 国产精品久久久久久久久久久久冷 | 国产做a爰片久久毛片a我的朋友 | 欧美日韩国产精品一区二区亚洲 | 国产一级视频 | 国产成年免费视频 | 亚洲欧美日韩在线一区 | 欧美一区二区精品 | 久久综合久久久 | 久久91| 精品久久国产 | 亚洲人成人一区二区在线观看 | 91精品国产一区二区三区四区在线 | 美女黄在线观看 | 国产精品中文字幕在线观看 | 亚洲国产成人在线 | 午夜免费福利在线 | 亚洲黄色一级毛片 | 精品久久久久久久久久久久久 | 99精品久久精品一区二区爱城 | 国产精品无码永久免费888 | 日本在线免费电影 | 欧美日韩一区二区三区在线观看 | 华丽的挑战在线观看 | 日韩在线播放一区 | 国产欧美一区二区视频 | 一区二区三区四区精品 | 国产视频1 | 久久久久久久久一区二区三区 | 欧美日韩精品综合 | 丁香五月亚洲综合在线 | 成人夜晚看av | 99久久99久久 | 久热精品视频 | 999久久久国产999久久久 | 日韩和的一区二区 | 国产精品日韩一区二区 | 久久久综合网 | 天天看天天摸天天操 | 久久久久久亚洲一区二区三区蜜臀 | 成人免费视频观看 | 成人av网站免费观看 | 黄色av网站在线免费观看 | 日韩一级免费观看 | 爱爱视频在线观看 | 成人影院av| 亚洲一区二区三区免费 | 国产欧美日韩一区 | 精品久久久久久久久久久久久久久久久久 | 国产精品福利网站 | 欧美一区二区三区在线观看 | 午夜国产影院 | 91精品国产综合久久久久久丝袜 | www.日韩系列 | 精品亚洲视频在线观看 | 午夜免费观看视频 | 国产免费自拍 | 日韩国产欧美一区 | 欧美黄色网 | 欧美精品一区二区三区四区五区 | 色吊丝在线永久观看最新版本 | 亚洲一区二区三区四区五区中文 | 久久99国产伦子精品免费 | 久日精品 | 一区二区三区有限公司 | 黄色免费网址大全 | 精产国产伦理一二三区 | 国产精品久久久久久久一区探花 | 国产精品99久久久久久www | 亚洲日本韩国欧美 | av午夜电影| 久久久精品影院 | 欧美一级片在线观看 | 亚洲欧洲一区二区 | 国产午夜精品美女视频明星a级 | 理论黄色片| 99re6在线视频精品免费 | 久久99精品久久久久久园产越南 | 超碰在线播| 亚洲第一福利视频 | 亚洲网站久久 | 国产精品久久久久久久久久三级 | 免费xxxx大片国产在线 | 99免费视频 | 精品一区二区三区四区五区 | 国产精品高潮呻吟久久av黑人 | av网站免费看 | 日韩视频在线观看 | 91在线精品一区二区三区 | 欧美日韩久久精品 | 国产免费一区二区三区最新不卡 | 亚洲www视频| 日本三级欧美三级 | 国产猛男猛女超爽免费视频网站 | 亚洲一区二区在线 | 真人女人一级毛片免费播放 | 狠狠综合久久 | 91精品久久久久久久久入口 | www.色94色.com | 日日操天天操 | 成人 在线 | 久久精品成人 | 99在线观看 | 久久久99精品免费观看 | 在线视频一区二区 | 久久综合一区二区三区 | 国产中文在线 | 日韩精品 电影一区 亚洲 | 欧美一级在线观看 | 国产伦精品一区二区三区四区视频 | 私人毛片免费高清视频 | 亚洲综合无码一区二区 | 国产九色视频 | 国产亚洲一区二区三区在线 | 久久久久久久久国产 | 亚洲性视频网站 | 久久综合一区二区 | 在线视频二区 | 欧美一区二区三区在线 | 天天干天天看天天操 | 91在线最新| 亚州成人 | 欧美一区二区在线免费观看 | 色xx综合网 | 一区国产精品 | 亚洲一区二区三区四区五区中文 | 国产伦精品一区二区三区高清 | 久久久中文 | 四虎影院免费网址 | 成人欧美一区二区三区 | 欧美亚洲国产一区 | 精品视频一区在线观看 | 久久久天天 | 免费看黄色一级视频 | 久久99深爱久久99精品 | 免费在线观看一区二区 | zzzwww在线观看免 | 在线免费av观看 | 午夜欧美一区二区三区在线播放 | 国产在线精品一区二区三区 | 男女视频免费 | 51ⅴ精品国产91久久久久久 | 亚洲成人免费视频在线观看 | 日韩国产在线观看 | 91一区二区三区 | 欧一区二区 | 黄色激情网站 | 97色婷婷成人综合在线观看 | 国产精品99久久久久久www | 欧美激情在线观看 | 久在草视频 | 色综合天天天天做夜夜夜夜做 | 久久国产精品无码网站 | 欧美一区二区三区国产精品 | 婷婷五月色综合 | 免费的日批视频 | 国产69精品久久久久观看黑料 | 精品成人免费一区二区在线播放 | 午夜久久| 海外中文字幕在线观看 | 日本激情视频一区二区三区 | 日韩av片在线免费观看 | 精品999www | 国产自产才c区 | 国产视频精品久久 | 最新黄色网页 | 成人免费毛片aaaaaa片 | 中文字幕av高清 | 欧美夜夜爽 | 一区二区在线免费观看 | 可以免费在线观看av的网站 | 欧美在线亚洲 | 亚洲区在线 | 午夜久久久| 国产在线成人 | 羞羞视频网站在线免费观看 | 日本免费在线视频 | 日韩在线观看视频一区二区 | 免费av中国 | 国产激情影院 | 亚洲成人免费 | 精品 99| 日韩久草 | 国产91在线播放精品 | 国产精品久久久久一区二区三区 | 精品国产一区二区三区性色av | 亚洲第一成人在线视频 | 久久久99久久久国产自输拍 | 中文字幕在线电影 | 色接久久 | 免费亚洲一区二区 | 91视频分类 | 国产精品久久久久久久免费大片 | 国产精品久久国产愉拍 | 男女啪网站 | 午夜在线观看免费 | 国产一区2区 | av免费网站在线观看 | 夜夜久久 | 免费的一级毛片 | 免费的国产视频 | 视频在线一区二区 | 国产精品久久久久久久久久久久久 | 在线国产一区二区 | 国产精品久久久久久久久久久久 | 日韩乱码中文字幕 | 久久爱www.| 亚洲97色 | 国产精品二区三区 | 99国产精品久久久 | 国产在线一区二区 | 成人毛片在线视频 | 图片区 国产 欧美 另类 在线 | 久久久久久国产精品 | 成人国产电影 | 日韩精品av一区二区三区 | 日韩视频精品在线 | 最新中文字幕在线 | 网站一区二区三区 | 亚洲www视频| 国内自拍视频在线观看 | 日韩一区二区在线免费 | 在线视频成人 | 中文字幕一区二区三区在线视频 | 国产精品久久久久久吹潮 | 久久精品国产免费 | 91精品国产自产91精品 | 在线观看亚洲一区二区 | 日韩在线播放一区二区三区 | 91视在线国内在线播放酒店 | 成人在线视频免费观看 | 成人在线免费观看 | 99精品国产高清在线观看 | 亚洲视频中文字幕 | 精品一区二区三区免费 | 成人av观看| 国产三级日本三级美三级 | 久久都是精品 | 欧美激情视频一区二区三区在线播放 | 久久一 | 波多野结衣福利电影 | 亚洲欧美日韩另类精品一区二区三区 | 午夜影院免费版 | 91精品久久久久久综合五月天 | 日韩在线视频观看 | 国产视频网 | 四虎成人免费电影 | 国产精品久久久久久久久久久久午夜片 | 蜜桃av人人夜夜澡人人爽 | 久久久91精品国产一区二区精品 | 欧美理论片在线观看 | 在线欧美视频 | 国产精品一区在线观看你懂的 | 亚洲一区中文字幕在线 | 99亚洲国产精品 | 国产成人中文字幕 | 日韩三级 | 国产精品久久久久免费a∨ 欧洲精品一区 | 国产精品网站在线观看 | 国产激情免费 | 色就是色网站 | 欧美一区二区在线观看 | 91在线观看视频 | 在线只有精品 | 成人免费在线观看 | 黄色小视频在线观看 | 二区国产 | 精品三级三级三级三级三级 | 久久久久久影院 | 在线亚洲观看 | 麻豆产精国品免费入口 | 波多野结衣一区三区 | 特级淫片女子高清视频在线观看 | 亚洲视频在线看 | 日本三级视频 | 欧美日韩视频一区二区 | 自拍偷拍视频网站 | 久久综合av | 草草成人| 国产98色在线 | 一级黄色片a级 | 成人精品一区二区三区中文字幕 | 荡女妇边被c边呻吟视频 | 精品影院| 一区二区中文字幕 | 玖玖玖精品视频 | 91短视频版在线观看www免费 | 欧美午夜精品一区二区三区电影 | 九九爱爱视频 | 欧美亚洲一| 在线看亚洲 | 欧美日韩午夜 | 91视频免费看片 | 性视频网站免费 | 亚洲性网| 国产精品久久久久久吹潮 | 精品久久久久久久久福利 | 亚洲成人aaa | 中文一区 | 可以看av的网站 | 国产精品一区二区三区四区五区 | 国产成人精品亚洲日本在线观看 | 成人a网| 久久激情网 | 中文字幕在线观 | av一区二区在线观看 | 成人国产免费视频 | 91精品久久久久久久久 | 日本高清视频在线播放 | 国产高清在线观看 | 亚洲1级片 | 国产成人综合网 | 特级淫片日本高清视频免费 | 天天干夜夜操 | 欧美精品一区二区三区蜜臀 | 蜜臀视频在线观看 | 噜噜噜噜噜在线视频 | 中文字幕在线观看一区二区三区 | 欧美日韩一区二区电影 | 91豆花视频 | 亚洲精品中文字幕中文字幕 | 亚洲日韩欧美一区二区在线 | 精品一区二区三区在线观看视频 | 久久精品系列 | 日本jizz在线观看 | 国产精品一区欧美 | 国产中文字幕一区 | 九色91九色porny永久 | 国产欧美精品区一区二区三区 | 亚洲精品成人av | 欧美一区 | 国产精品影院在线观看 | 久久精品在线 | 九九亚洲精品 | 精品国产乱码久久久久久久软件 | 蜜桃精品久久久久久久免费影院 | 欧美色阁 | 欧美一区久久 | 一本大道综合伊人精品热热 | 久久久久久国产免费视网址 | 国产精品中文字幕在线播放 | www.xxxx在线观看 | 91免费看片网站 | 久久综合一区二区三区 | 国产日韩av在线 | 天天色av| 久久午夜电影院 | 毛片一区二区 | 日韩精品久久久 | 国产精品久久久久久无遮挡 | 欧美性猛交一区二区三区精品 | 一区二区三区在线免费播放 | 色吊丝在线永久观看最新版本 | 久久久天堂国产精品女人 | 亚洲二区在线 | 国产美女在线观看 | 国产猛男猛女超爽免费视频网站 | 天堂中文在线视频 | 国产成人久久777777 | 精品久久久久久久久久久久包黑料 | 欧美精品在线观看 | 欧美电影一区 | 黄色免费av | 免费观看成人毛片 | 在线观看av网站永久 | 女同理伦片在线观看禁男之园 | 国产成人高清 | 91免费观看 | 精品国产黄a∨片高清在线 日韩一区二 | 青青久视频 | 久久高清片 | 亚洲欧洲精品一区二区 | 国产最好的精华液网站 | 久久免费黄色网址 | 91久久国产 | 亚洲欧洲精品一区二区三区 | 国产成人综合网 | 精品日韩在线 | 日本精品在线观看 | 一区二区三区av | 精品成人网 | 精品日韩欧美一区二区三区 | 国产在线一区二区三区 | 亚洲免费观看视频 | 欧美精品成人一区二区在线 | 天天爽夜夜爽夜夜爽精品视频 | 不卡一区二区三区四区 | 日韩欧美自拍 | 巨大黑人极品videos精品 | 久日精品| 免费观看一级毛片 | 亚洲欧美精品一区二区三区 | 欧美日韩一区二区三 | 久久久网 | 中文字字幕一区二区三区四区五区 | 人人干人人干人人干 | 91精品福利 | 国产精品综合 | 一级免费片 | 国产高清精品一区二区三区 | 国产一级视频 | 四虎动漫|