如何将变量传递给扩展类的方法

时间:2019-02-15 14:36:09

标签: java java-bytecode-asm

我正在扩展类ClassVisitor,并重写方法visitMethod。然后,我扩展MethodVisitor并覆盖visitMethodInsn。当我覆盖visitMethod时,我将创建扩展MethodVisitor的新实例。

请查看下面的代码以了解。请记住,需要ASM库的知识才能正确理解它。

GraphClass.java:

public class GraphClass extends ClassVisitor {
    public GraphClass() {
        super(ASM5);
    }

    public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
        System.out.println("testing " + name + desc);
        GraphMethod newVisitor = new GraphMethod();
        return newVisitor;
    }
}

GraphMethod.java:

public class GraphMethod extends MethodVisitor{
    public GraphMethod() {
        super(ASM5);
    }

    public void visitMethodInsn(int opcode, java.lang.String owner, java.lang.String name, java.lang.String descriptor, boolean isInterface) {
        System.out.println(owner + name);
    }
}

我想做的是传递name中的visitMethod变量以及visitMethodInsn中的其他变量。

我是Java的新手,所以任何提示都将非常有帮助。

1 个答案:

答案 0 :(得分:0)

基于这些注释,我假设您想知道被访问类的方法调用了哪些方法,

使用objectweb asm的tree-api轻松解决问题。

ClassReader cr = new ClassReader(bytesOfSomeClass);
//Used class node instead of visiter
ClasaNode cn = new ClassNode(<asm version>);

cr.accept(cn, 0);

//Iterate all methods of class
cn.methods.forEach( (MethodNode mn) -> {
    String callerName = mn.name;

    //Iterate all instructions of current method
    Stream.iterate(mn.instructions.getFirst(), AbstractInsnNode::getNext).limit(instructions.size())
        .filter(node -> node instanceof MethodInsnNode) //take only method calls
        .forEach(node -> {
            String calledName = ((MethodInsnNode) node).name;
            //Print results
            System.out.println(calledName + " is called by " + callerName);
         });
});
相关问题