【问题标题】:Create method using ASM使用 ASM 创建方法
【发布时间】:2016-03-14 16:43:20
【问题描述】:

使用 ASM,我需要修改一个方法,然后我需要在其中插入两个方法。我已经很好地修改了,但是如何创建一个方法?我需要单独的MethodVisitor,还是可以使用同一个,但调用其他名称?

【问题讨论】:

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


    【解决方案1】:

    需要在对应的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();
      }
    }
    

    【讨论】:

    • 所以我的 ClassVisitor 将有 visitEnd() 方法。我的文件需要添加两个方法。那么我是否会有三个 MethodVisitor:一个用于我要插入方法的代码,另外两个用于我要插入的两种方法?但是我只需要一个 ClassVisitor 吗?
    • 您需要实现一个 MethodVisitor,它通过包装“超级”方法访问者来修改原始代码。然后从包装 ClassWriter 的 ClassVisitor 的 VisitEnd 方法调用 visitMethod 两次并将代码直接插入返回的 MethodVisitor。
    • 那么我需要 3 个 MethodVisitor 吗?但是只有 1 个 ClassVisitor 我在其中调用了两次 visitEnd() 方法?
    • 我在答案中添加了示意图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多