[asm4-guide](http://download.forge.objectweb.org/asm/asm4-guide.pdf)学习心得
ASM是一种小巧轻便的 Java 字节码操控框架,它能方便地生成和改造 Java 代码
ASM通过ClassVisitor
来生成和转换class字节码. ClassVisitor
中的每个方法都对应着class数据结构, 你可以通过每个方法名轻松的判断出这个方法对应的是哪个数据结构.
ClassVisitor
内的方法调用顺序如下:
- visit : 调用
visit
方法(有且仅有调用一次) - visitSource? : 调用
visitSource
函数(最多调用一次) - visitOuterClass? : 调用
visitOuterClass
函数(最多调用一次) - ( visitAnnotation | visitAttribute )* : 调用
visitAnnotation
和visitAttribute
函数, 这俩个函数的调用可调用任意次且不分前后顺序 - ( visitInnerClass | visitField | visitMethod )* : 调用
visitInnerClass
,visitField
和visitMethod
函数, 同样对这三个函数的调用不限制次数以及不分前后顺序 - visitEnd : 调用
visitEnd
函数(有且仅有调用一次),调用这个函数用于结束整个过程.
ASM通过基于ClassVisitor
的三个API来生成和转换class字节码
ClassReader
: 用于解析一个给定的class二进制字节数组, 然后按照上文介绍的顺序依次调用accept()
的ClassVisitor
参数的方法.ClassWriter
: 一个ClassVisitor
的子类, 用于直接生成二进制的字节码.ClassVisitor
: 代理了全部的字节码相关的方法调用. 它接收另一个ClassVisitor
对象形成责任链模式调用.
我们通过ClassReader
来解析一个二进制的class结构数据, 然后ClassReader
按照一定的顺序调用ClassVisitor
来改变class结构数据, 最后通过ClassVisitor
生成新的class二进制数据.