元数据
本章介绍了用于已编译Java类元数据(例如注解)的树API。
之所以很短,是因为这些元数据已经在第4章中介绍过,并且因为一旦知道了相应的 core API,树API就很简单。
泛型
树API不提供对泛型类型的任何支持!
确实,它代表了带有签名的泛型类型,就像在核心API中一样,但是没有提供与SignatureVisitor对应的SignatureNode类,尽管这是可能的(实际上,使用多个Node类来区分类型,方法和类会很方便。 签名)。
注解
用于注解的树形API基于AnnotationNode类,其公共API如下:
public class AnnotationNode extends AnnotationVisitor {
public String desc;
public List<Object> values;
public AnnotationNode(String desc);
public AnnotationNode(int api, String desc);
... // methods of the AnnotationVisitor interface
public void accept(AnnotationVisitor av);
}
desc字段包含注解类型,而values字段包含名称值对,其中每个名称后均带有其关联的值(值的表示形式在Javadoc中进行了描述)。
如您所见,AnnotationNode类扩展了AnnotationVisitor类,并且还提供了一个accept方法,该方法将此类对象作为参数,例如ClassNode和MethodNode类以及类和方法访问者类。
因此,我们在类和方法上看到的模式也可以用于组成注释的核心和树API组件。
例如,基于继承的模式的“匿名内部类”变体(请参阅第7.2.2节)适用于注解,它给出:
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
return new AnnotationNode(ASM4, desc) {
@Override public void visitEnd() {
// put your annotation transformation code here
accept(cv.visitAnnotation(desc, visible));
}
};
}
除错
编译类的源文件存储在ClassNode的sourceFile字段中。
有关源行号的信息存储在LineNumberNode对象中,该对象的类继承自AbstractInsnNode。
与核心API类似,在核心API中,与指令同时访问有关行号的信息,LineNumberNode对象是指令列表的一部分。
最后,源局部变量的名称和类型存储在MethodNode的localVariables字段中,该字段是LocalVariableNode对象的列表。