上一篇说到如何用asm操作一个类.本文将介绍,更多关于类操作的内容.
用asm操作类,因为asm提供了两种api,core与tree,所以需要分别熟悉这两种api.相关的文章也很多,这里作一个总结式的介绍.
1.core api
上文使用的是core api,它的主要类有:
AnnotationVisitor 访问注解
Attribute java虚拟机中定义的非标准类,属性,方法
ByteVector 动态扩展的向量类型
ClassReader 解析类结构的访问器
ClassVisitor 访问类的访问器
ClassWriter 生成类结构的访问器
ConstantDynamic 运行时常量
FieldVisitor 属性访问器
Handle 属性或方法引用
Label 方法所在的字节码位置
MethodVisitor 方法访问器
ModuleVisitor java模块访问器
RecordComponentVisitor 访问组件用的
Type 属性或方法的类型
TypePath 类型参数的路径,通配符边界,数组元素类型或静态内部类型
TypeReference 类,方法,属性的类型引用声明
常用的有ClassReader,ClassVisitor,ClassWriter,FieldVisitor,Label,MethodVisitor
这些在上面的例子已经见识过了.
core api的特点是流式读取的.
比如扫描到类文件时,会回调ClassVisitor
的visit()
方法,扫描到类注解时,会回调ClassVisitor
的visitAnnotation()
方法等等.
扫描后,回调相应方法,并会返回一个对应的字节码操作对象,修改这个对象,就可以修改class
文件相应结构内容,最后将这个ClassVisitor
字节码内容覆盖原来.class