2016-03-13 56 views
0

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

回答

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

所以我ClassVisitor将有visitEnd()方法。我的文件需要添加两个方法。我会有三个MethodVisitors:一个用于我插入到方法中的代码,另外两个用于我要插入的两个方法?但是,我只需要一个ClassVisitor? – JD9999

+0

您需要实现一个MethodVisitor,通过包装“超级”方法访问来修改原始代码。从包装ClassWriter的ClassVisitor的VisitEnd方法中,您可以调用visitMethod两次并直接在返回的MethodVisitor上插入代码。 –

+0

那么我需要3个MethodVisitors?但是只有一个ClassVisitor在其中我调用visitEnd()方法两次? – JD9999