注释的树 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);
... // AnnotationVisitor 接口的方法
public void accept(AnnotationVisitor av);
}
desc 字段包含了注释类型,而 values 字段包含了名称/值对,其中每个名字后面都跟有相关联的值(值的表示在 Javadoc 中描述)。
可以看出,AnnotationNode 类扩展了 AnnotationVisitor 类,还提供了一个 accept 方法,它以一个这种类型的对象为参数,比如具有这个类和方法访问器类的 ClassNod 和MethodNode 类。我们前面已经看到用于类和方法的模式也可用于合成处理注释的核心与树 API 组件。例如,对于基于继承的模式(见 7.2.2 节),可进行“匿名内部类”的变体,使其适用于注释,给出如下:
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
return new AnnotationNode(ASM4, desc) {
@Override
public void visitEnd() {
// 将注释转换代码放在这里
accept(cv.visitAnnotation(desc, visible));
}
};
}