我正在使用ClassAdapter
asm 框架编写字节码转换器。如果类上存在自定义注释,我想添加一些方法并使类实现接口。添加方法工作正常,但我想知道让类实现接口的最佳方法是什么。由于visitAnnotation
仅在 after 调用visit
,我需要以某种方式延迟调用超级访问方法并缓冲所有需要的信息,直到那时。
有没有人实现过类似的东西?我是否应该为此使用 asm 的树 API,尽管包文档建议尽可能避免使用它?
这是转换的一般结构:
public class MyClassAdapter extends ClassAdapter {
private String classname;
private boolean instrument;
public PropertyChangeSupportAdapter(ClassVisitor cv) {
super(cv);
}
@Override
public void visit(final int version, final int access, final String name, final String signature, final String superName, final String[] interfaces) {
super.visit(version, access, name, signature, superName, interfaces);
this.classname = name;
}
@Override
public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
if (desc.equals("Lmypackage/MyAnnotation;")) {
instrument = true;
System.out.println("Instrumenting " + classname);
}
return super.visitAnnotation(desc, visible);
}
@Override
public void visitEnd() {
if (instrument) {
// add methods
}
}
}