使用ASM创建方法

时间:2016-03-13 00:43:30

标签: java bytecode java-bytecode-asm bytecode-manipulation

使用ASM,我需要修改一个方法,然后我需要在其中插入两个方法。我已经修改了很好,但是如何创建方法呢?我是否需要一个单独的MethodVisitor,或者我可以使用相同的一个,但是可以调用别的东西吗?

1 个答案:

答案 0 :(得分:4)

您需要在相应的ClassWriter上调用visitMethod,为每个方法创建一个新的MethodVisitor。

无法重复使用MethodVisitor。如果要将方法插入现有类,通常可以通过ClassVisitor的visitEnd方法读取原始类文件。

这种转变的示意图如下所示:

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();
  }
}