Я пишу преобразователь байт-кода, используя ClassAdapter
платформы asm. Если в классе присутствует пользовательская аннотация, я хочу добавить несколько методов и заставить класс реализовать интерфейс. Добавление методов работает нормально, но мне интересно, как лучше всего заставить класс реализовать интерфейс. Поскольку visitAnnotation
вызывается только после visit
, мне нужно каким-то образом отложить вызов метода супер-посещения и буферизовать всю необходимую информацию до этого момента.
Кто-нибудь реализовывал нечто подобное? Должен ли я использовать для этого дерево api asm, хотя документация к пакету рекомендует избегать его, если это возможно?
Вот общая структура преобразования:
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
}
}
}