ClassAdapter
asm フレームワークを使用してバイトコード トランスフォーマーを作成しています。クラスにカスタム アノテーションが存在する場合は、いくつかのメソッドを追加して、クラスにインターフェイスを実装させたいと考えています。メソッドの追加は正常に機能していますが、クラスにインターフェイスを実装させる最善の方法は何だろうと思っています。visitAnnotation
は の後にしか呼び出されないためvisit
、どうにかして super 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
}
}
}