转载

ASM 库的 classVisitor 类解析

定义在读取Class字节码时会触发的事件,如类头解析完成、注解解析、字段解析、方法解析等。

该类用于访问Java类的所有元素,是一个抽象类。子类实现其方法后可以完成对已编译类的读写。

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的实现,具体的实现完全依赖于子类。

正文到此结束
本文目录