1、什麼是ASM html
http://bbs.itheima.com/thread-23776-1-1.html?fstgj java
之前的學習網站,-全套java視頻教程,須要的本身看下,能夠去這個網站下載,下載視頻免費,不須要註冊和作什麼任務 web
ASM是一個java字節碼操縱框架,它能被用來動態生成類或者加強既有類的功能。ASM 能夠直接產生二進制 class 文件,也能夠在類被加載入 Java 虛擬機以前動態改變類行爲。Java class 被存儲在嚴格格式定義的 .class文件裏,這些類文件擁有足夠的元數據來解析類中的全部元素:類名稱、方法、屬性以及 Java 字節碼(指令)。ASM從類文件中讀入信息後,可以改變類行爲,分析類信息,甚至可以根據用戶要求生成新類。
使用ASM框架須要導入asm的jar包,下載連接:asm-3.2.jar。 數組
2、如何使用ASM 框架
ASM框架中的核心類有如下幾個: 學習
① ClassReader:該類用來解析編譯過的class字節碼文件。 網站
② ClassWriter:該類用來從新構建編譯後的類,好比說修改類名、屬性以及方法,甚至能夠生成新的類的字節碼文件。 spa
③ ClassAdapter:該類也實現了ClassVisitor接口,它將對它的方法調用委託給另外一個ClassVisitor對象。 code
示例1.經過asm生成類的字節碼 視頻
1 package com.asm3; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 8 import org.objectweb.asm.ClassWriter; 9 import org.objectweb.asm.Opcodes; 10 11 /** 12 * 經過asm生成類的字節碼 13 * @author Administrator 14 * 15 */ 16 public class GeneratorClass { 17 18 public static void main(String[] args) throws IOException { 19 //生成一個類只須要ClassWriter組件便可 20 ClassWriter cw = new ClassWriter(0); 21 //經過visit方法肯定類的頭部信息 22 cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC+Opcodes.ACC_ABSTRACT+Opcodes.ACC_INTERFACE, 23 "com/asm3/Comparable", null, "java/lang/Object", new String[]{"com/asm3/Mesurable"}); 24 //定義類的屬性 25 cw.visitField(Opcodes.ACC_PUBLIC+Opcodes.ACC_FINAL+Opcodes.ACC_STATIC, 26 "LESS", "I", null, new Integer(-1)).visitEnd(); 27 cw.visitField(Opcodes.ACC_PUBLIC+Opcodes.ACC_FINAL+Opcodes.ACC_STATIC, 28 "EQUAL", "I", null, new Integer(0)).visitEnd(); 29 cw.visitField(Opcodes.ACC_PUBLIC+Opcodes.ACC_FINAL+Opcodes.ACC_STATIC, 30 "GREATER", "I", null, new Integer(1)).visitEnd(); 31 //定義類的方法 32 cw.visitMethod(Opcodes.ACC_PUBLIC+Opcodes.ACC_ABSTRACT, "compareTo", 33 "(Ljava/lang/Object;)I", null, null).visitEnd(); 34 cw.visitEnd(); //使cw類已經完成 35 //將cw轉換成字節數組寫到文件裏面去 36 byte[] data = cw.toByteArray(); 37 File file = new File("D://Comparable.class"); 38 FileOutputStream fout = new FileOutputStream(file); 39 fout.write(data); 40 fout.close(); 41 } 42 }
生成一個類的字節碼文件只須要用到ClassWriter類便可,生成Comparable.class後用javap指令對其進行反編譯:javap -c Comparable.class >test.txt ,編譯後的結果以下:
1 public interface com.asm3.Comparable extends com.asm3.Mesurable { 2 public static final int LESS; 3 4 public static final int EQUAL; 5 6 public static final int GREATER; 7 8 public abstract int compareTo(java.lang.Object); 9 }
注:一個編譯後的java類不包含package和import段,所以在class文件中全部的類型都使用的是全路徑。
示例2.修改類的字節碼文件
C.java