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

How to pass a variable to a method of an extended class

我正在扩展 class 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);
    }
}

我想做的是将 visitMethod 中的 name 变量与 visitMethodInsn 中的其他变量一起打印。

我是 Java 的新手,所以任何提示都会很有帮助。

根据评论,我假设您想知道访问的方法调用了哪些方法 class,好吗?

使用 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);
         });
});