Как передать переменную в метод расширенного класса - PullRequest
0 голосов
/ 15 февраля 2019

Я расширяю класс 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 голосов
/ 17 августа 2019

Основываясь на комментариях, я предполагаю, что вы хотите знать, какие методы вызываются методами посещаемого класса, хорошо?

Это легко решается с помощью tree-api objectweb asm.

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