Java ASM查找具体的实现类

时间:2014-07-19 18:47:14

标签: java bytecode

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

所有帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

要查找具体课程,您需要查看extends classimplements interfaces 当你在标题中找到这些类时,你需要依次查找这些类,也可能是他们的父母。