定义在读取Class字节码时会触发的事件,如类头解析完成、注解解析、字段解析、方法解析等。
该类用于访问Java类的所有元素,是一个抽象类。子类实现其方法后可以完成对已编译类的读写。
代码语言:javascript复制package org.objectweb.asm;
public abstract class ClassVisitor {
// 实现的ASM的API版本。该字段的值必须为如下几个之一:Opcodes.ASM4,ASM5,ASM6,ASM7
protected final int api;
// 该类的方法可以委托给子类
protected ClassVisitor cv;
// 构造器
public ClassVisitor(final int api) {
this(api, null);
}
// 构造器
public ClassVisitor(final int api, final ClassVisitor classVisitor) {
if (api != Opcodes.ASM6 && api != Opcodes.ASM5 && api != Opcodes.ASM4 && api != Opcodes.ASM7) {
throw new IllegalArgumentException();
}
this.api = api;
this.cv = classVisitor;
}
/**
* 访问类头部信息
*
* @param version
* 类版本
* @param access
* 类访问标识符public等
* @param name
* 类名称
* @param signature
* 类签名(非泛型为NUll)
* @param superName
* 类的父类
* @param interfaces
* 类实现的接口
*/
public void visit(
final int version,final int access,
final String name, final String signature,
final String superName,final String[] interfaces) {
if (cv != null) {
cv.visit(version, access, name, signature, superName, interfaces);
}
}
/**
* 访问类的源文件.
*
* @param source
* 源文件名称
* @param debug
* 附加的验证信息,可以为空
*/
public void visitSource(final String source, final String debug) {
if (cv != null) {
cv.visitSource(source, debug);
}
}
public ModuleVisitor visitModule(final String name, final int access, final String version) {
if (api < Opcodes.ASM6) {
throw new UnsupportedOperationException("This feature requires ASM6");
}
if (cv != null) {
return cv.visitModule(name, access, version);
}
return null;
}
public void visitNestHost(final String nestHost) {
if (api < Opcodes.ASM7) {
throw new UnsupportedOperationException("This feature requires ASM7");
}
if (cv != null) {
cv.visitNestHost(nestHost);
}
}
public void visitOuterClass(final String owner, final String name, final String descriptor) {
if (cv != null) {
cv.visitOuterClass(owner, name, descriptor);
}
}
/**
* 访问类的注解
*
* @param desc
* 注解类的类描述
* @param visible
* runtime时期注解是否可以被访问
* @return 返回一个注解值访问器
*/
public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) {
if (cv != null) {
return cv.visitAnnotation(descriptor, visible);
}
return null;
}
/**
* 访问标注在类型上的注解
*
* @param typeRef
* @param typePath
* @param desc
* @param visible
* @return
*/
public AnnotationVisitor visitTypeAnnotation(
final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) {
if (api < Opcodes.ASM5) {
throw new UnsupportedOperationException("This feature requires ASM5");
}
if (cv != null) {
return cv.visitTypeAnnotation(typeRef, typePath, descriptor, visible);
}
return null;
}
/**
* 访问一个类的属性
*
* @param attribute
* 类的属性
*/
public void visitAttribute(final Attribute attribute) {
if (cv != null) {
cv.visitAttribute(attribute);
}
}
public void visitNestMember(final String nestMember) {
if (api < Opcodes.ASM7) {
throw new UnsupportedOperationException("This feature requires ASM7");
}
if (cv != null) {
cv.visitNestMember(nestMember);
}
}
/**
* 访问内部类信息
* @param name
* @param outerName
* @param innerName
* @param access
*/
public void visitInnerClass(
final String name, final String outerName, final String innerName, final int access) {
if (cv != null) {
cv.visitInnerClass(name, outerName, innerName, access);
}
}
/**
* 访问类的字段
* @param access
* @param name
* @param desc
* @param signature
* @param value
* @return
*/
public FieldVisitor visitField(
final int access,
final String name,
final String descriptor,
final String signature,
final Object value) {
if (cv != null) {
return cv.visitField(access, name, descriptor, signature, value);
}
return null;
}
/**
* 访问类的方法
* @param access
* @param name
* @param desc
* @param signature
* @param exceptions
* @return
*/
public MethodVisitor visitMethod(
final int access,
final String name,
final String descriptor,
final String signature,
final String[] exceptions) {
if (cv != null) {
return cv.visitMethod(access, name, descriptor, signature, exceptions);
}
return null;
}
public void visitEnd() {
if (cv != null) {
cv.visitEnd();
}
}
}
可以看出ClassVisitor 是一个抽象类,visitXXX()方法只是简单地调用了子类的实现。在构造器中传入一个ClassVisitor的实现,具体的实现完全依赖于子类。