我使用了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
}
}
}