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