我正在扩展类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的新手,所以任何提示都将非常有帮助。
答案 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);
});
});