我是java字节编码的新手,我一直在努力解决这个问题。 我正在使用java ASM字节码工程库。我想找到所有的方法和 实现特定方法调用的那些方法的类。姓名和 被调用方法的描述和实现被调用方法的类的名称。 问题是,当正在分析的方法调用已定义的方法时 在接口或抽象类中,我无法找到具体类的名称 实际上实现了被调用的方法这也是我的一些代码和测试输出 可视化情况。
public class MyClassVisitor extends ClassVisitor {
public List<MethodCallers> methodCallers;
public MyClassVisitor() {
super(Opcodes.ASM4);
this.methodCallers = new ArrayList<>();
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
MethodCallers methodData = new MethodCallers(name, desc);
this.methodCallers.add(methodData);
return new MyMethodVisitor(methodData);
}
}
public class MyMethodVisitor extends MethodVisitor {
private final MethodCallers methodCallers;
public MyMethodVisitor(MethodCallers methodCallers) {
super(Opcodes.ASM4);
this.methodCallers = methodCallers;
}
@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc) {
String implementingClass = owner;
if(opcode == Opcodes.INVOKEINTERFACE) {
/* Here I would need to find the concrete implementing class */
/* implementingClass = something */
}
this.methodCallers.addCaller(new CalledMethod(name, desc, implementingClass));
}
}
public static void main(String[] args) throws Exception {
ClassReader classReader = new ClassReader("TestClass");
MyClassVisitor classVisitor = new MyClassVisitor();
classReader.accept(classVisitor, 0);
//...
}
和输出:
名称:描述:()V 称这些方法 名字:Desc:在类java / lang / Object中 名字:Desc:在类java / util / ArrayList
中名称:增量描述:(I)V
称这些方法 名字:valueOf描述:类java / lang / Integer中的valueOf
调用名称:添加描述:在类java / util / List / *中添加这里我想看看ArrayList而不是List * /
所有帮助将不胜感激!
答案 0 :(得分:0)
要查找具体课程,您需要查看extends class
或implements interfaces
当你在标题中找到这些类时,你需要依次查找这些类,也可能是他们的父母。