나는 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
}
}
}