Java 字節碼操縱框架 -ASM
1.ASM 概述:
ASM 是用于 Java 字節碼操縱的框架,可動態生成新類或增強現有類的功能。它既能直接產生二進制 class 文件,也能在類被加載到虛擬機之前動態改變類行為,通過讀取類文件信息來分析、修改類行為,甚至生成新類。許多流行框架如 cglib、Hibernate、Spring 都直接或間接地使用 ASM 來操作字節碼。
2. ASM 編程模型
- Core API:提供基于事件形式的編程模型,不需要一次性將整個類的結構讀取到內存中,所以執行速度更快,內存占用少,但編程難度較大。
- Tree API:提供基于樹形的編程模型,需要一次性將一個類的完整結構全部讀取到內存中,因此內存需求較高,但編程方式相對簡單。
3.ASM 的 Core API
ASM Core API 中操縱字節碼的功能基于 ClassVisitor 接口,該接口中的每個方法對應 class 文件中的每一項。同時,ASM 提供了三個基于 ClassVisitor 接口的類來實現 class 文件的生成和轉換:
-
ClassReader:用于解析一個類的 class 字節碼。
-
ClassAdapter:是 ClassVisitor 的實現類,用于實現對類字節碼要進行的變化功能。
-
ClassWriter:也是 ClassVisitor 的實現類,能夠輸出經過變化后的字節碼。
4. ASMifier
ASM 提供了 ASMifier 工具輔助開發,可以使用該工具生成 ASM 結構以便對比分析。
mac 寫法
java -cp
/l
ib/asm-7.3.1.jar:../lib/asm-uti1-7.3.1.jar org.objectweb.asm.util.AsMifier com.test.jvm.asm
Test
Windows 寫法
java -cp
/l
ib/asm-7.3.1.jar;../lib/asm-uti1-7.3.1.jar org.objectweb.asm.util.AsMifier com.test.jvm.asm
Test
5. demo
5.1 添加ASM依賴
在項目中添加ASM的依賴。如果你使用的是Maven,可以在pom.xml中添加以下依賴
<dependency><groupId>org.ow2.asm</groupId><artifactId>asm</artifactId><version>9.2</version>
</dependency>
<dependency><groupId>org.ow2.asm</groupId><artifactId>asm-commons</artifactId