什么是ASM

ASM是一个操作java字节码的类库。
ASM的操作对象:字节码(bytecode)数据。一个java文件经过java编译器javac编译之后会生成.class文件,在.class文件中,存储的就是字节码数据,ASM的操作对象就是字节码,在很多情况下,字节码的具体表现形式就是class文件。
ASM是如何操作字节码数据的:ASM操作字节码的方式是先将字节码进行拆分,加入为达到某种目的实现的修改之后再进行合并。

ASM可以执行的操作:

  1. analysis:可以针对已有的class进行语法和语义分析,可以协助找到工程的bug,检测没有使用的代码,以及反编译工程代码
  2. generation:从无到有创建新的class文件
  3. transformation:针对已有的class进行变换,转换成新的class,其中包括优化程序,也可以针对程序进行混淆,或者添加性能检测的代码(AOP)。

典型应用:
4. Spring中的AOP,AOP可以通过JDK的动态代理进行实现,也可以依赖于CGlib进行实现,CGlib是在ASM的基础上构建起来的。
5. JDK中的lambda表达式是在JAVA8中引入的重要特性,允许将方法作为参数进行传递,使得代码更加简洁,而lambda表达式的调用是通过ASM实现的。所以JDK中是自带ASM的。

ASM分为两个部分,包含core API以及Tree API,Core API中包含三个部分,asm.jar,asm-utils.jar,以及asm-common.jar。

asmjar包中主要是使用到的是10个类,其中最主要的是classreader,classvisitor以及classwriter。他们之间的关系如下:

asm java 过程 java asm教程_asm java 过程


其中visit()修改的是类和父类的信息,visitField修改的是变量,visitMethod修改的是方法。

asm-utils中包含的是具体的类文件,主要分为check开头的类以及Trace开头的类,以check开头的类用于检查生成的class文件是否正确,Trace开头的类用于将class的内容打印输出,根据输出的文字信息可以探索或者trace(跟踪)class文件的内部信息。

ASM与classfile

asm java 过程 java asm教程_字节码_02


asm java 过程 java asm教程_数据_03


在学习了解ASM的时候需要了解classfile的内容,需要了解在class文件中各项数据的含义,比如method_info以及Code_attribute。classfile内容又与堆栈调用存在联系,在崩溃堆栈分析中需要解析寄存器的内容与含义,在classfile中同样是根据这部分内容进行的分析。