2014-07-19 38 views
0

我是新的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 */

所有帮助将不胜感激!

+0

你想静态或在运行时执行此操作吗? – Antimony

+0

对不起,我不完全确定你的意思,但在分析过程中没有任何程序分析的类发生变化。 – Hicks48

回答

0

找到你需要看extends classimplements interfaces 当你发现在标题中这些类的具体类,你需要查找这些类反过来,可能他们的父母也是如此。

+0

但是我怎么知道实现这个接口的那些类中的哪一个实际上就是这个方法调用的那个类呢? – Hicks48

+0

@ user3841112您可以通过递归搜索直到找到它。 –

+0

但是,我将如何识别它? visitMethodIns只给我操作码,所有者,名称和描述。并且owner是接口的名称,被调用方法的名称和desc在实现该接口的所有类中都是相同的。那么,我可以使用什么来识别来自所有实现类的正确类? – Hicks48