如果存在注释,则将接口添加到已转换的类

我正在使用asm框架的
ClassAdapter
编写一个字节码转换器。如果类上存在自定义注释,我想添加一些方法并使类实现一个接口。添加方法工作正常,但我想知道最好的方法是让类实现一个接口。因为
visitAnnotation
仅在
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
        }
    }
}
    
已邀请:
我最终使用了ClassNode和ClassAdapter apis的组合。首先将类文件解析为ClassNode:
ClassReader cr = new ClassReader(inputStream);
ClassNode cn = new ClassNode();
cr.accept(cn, 0);
然后可以检查when cn.visibleAnnotation或cn.invisibleAnnotations是否包含我的注释,以及该类是否已经实现了我想要添加的接口。在这种情况下,可以跳过第二步。然后可以使用ClassAdapter api转换ClassNode,如问题所示:
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
CheckClassAdapter ca = new CheckClassAdapter(cw);
ClassVisitor cv = new PropertyChangeSupportAdapter(ca);
cn.accept(cv);
包文档中的注释,这是我的问题的原因,提到了这些apis之间的巨大性能差异:   读取,“修改”和使用ClassAdapter编写类比使用ClassNode快几乎快两倍。 ...这也是为什么建议在可能的情况下不要使用此类适配器的原因。 重新阅读之后,差异似乎来自于使用ClassNode来操作字节码。但是,我没有对此混合解决方案进行基准测试     

要回复问题请先登录注册