要查找从类中调用的方法(假设以编程方式),我将使用ASM 字节码分析/操作库。下面的示例ClassVisitor
打印了从类中调用的所有方法。
import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.commons.InstructionAdapter;
public class MethodCallFinder extends ClassAdapter {
private String name;
public MethodCallFinder(ClassVisitor classVisitor) {
super(classVisitor);
}
@Override
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
this.name = name;
super.visit(version, access, name, signature, superName, interfaces);
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
return new MethodCallPrinter(super.visitMethod(access, name, desc, signature, exceptions));
}
private class MethodCallPrinter extends InstructionAdapter {
public MethodCallPrinter(MethodVisitor methodVisitor) {
super(methodVisitor);
}
@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc) {
System.out.printf("Class %s calls method %s with descriptor %s from class %s%n", MethodCallFinder.this.name, name, desc, owner);
super.visitMethodInsn(opcode, owner, name, desc);
}
}
}