Создать метод с использованием ASM

Используя ASM, мне нужно изменить метод, затем мне нужно вставить в него два метода. Я получил модификацию в порядке, но как мне создать метод? Нужен ли мне отдельный MethodVisitor, или я могу использовать тот же, но назвать что-то еще?

1 ответ

Решение

Вам нужно вызвать visitMethod для соответствующего ClassWriter, чтобы создать новый MethodVisitor для каждого метода.

MethodVisitor не может быть повторно использован. Если вы хотите вставить метод в существующий класс, вы обычно делаете это с помощью метода visitEnd класса ClassVisitor, считывающего исходный файл класса.

Схема такого преобразования будет выглядеть так:

class TransformingClassVisitor extends ClassVisitor {
  TransformingClassVisitor(ClassVisitor cv) { super(Opcodes.ASM5, cv); }

  @Override
  public MethodVisitor visitMethod(int opcode, String name, String owner, String desc, String signature, boolean iFace) {
    MethodVisitor mv = super.visitMethod(opcodes, name, owner, desc, signature, iFace);
    if (<isTransformedMethod>) {
      return new TransformingMethodVisitor(mv);
    }
    return mv;
  }

  @Override
  public void visitEnd() {
    MethodVisitor m1 = super.visitMethod(<firstMethod>);
    implement1(m1);

    MethodVisitor m2 = super.visitMethod(<secondMethod>);
    implement1(m2);

    super.visitEnd();
  }
}
Другие вопросы по тегам