關於java字節碼框架ASM的學習

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

複製代碼
1 package com.asm5; 2 3 public class C { 4 public void m() throws InterruptedException{ 5 Thread.sleep(100); 6  } 7 }
複製代碼
相關文章
相關標籤/搜索