我是新的Java字节编码,我一直在努力解决这个问题一段时间。 我正在使用java ASM字节码工程库。我想找到所有的方法和实现这些方法的特定方法所调用的类。名称和 被调用方法的描述和实现被调用方法的类的名称。 问题是,当正在分析的方法调用在接口或抽象类中定义为 的方法时,我无法找到 实际实现调用方法的具体类的名称。这里还有一些我的代码和测试输出,可以看出情况。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 :说明:类的java /郎/对象 称为名称:说明:类的java/util的/ ArrayList的
名称:增量描述:(I)V
调用这些方法 称为名称:的valueOf说明:在的valueOf类的java /郎/整数
叫名字:添加说明:添加类的Java/UTIL /列表/ *在这里,我想看到的ArrayList不是List */
所有帮助将不胜感激!
你想静态或在运行时执行此操作吗? – Antimony
对不起,我不完全确定你的意思,但在分析过程中没有任何程序分析的类发生变化。 – Hicks48