当前位置: 首页 > 知识库问答 >
问题:

Java ASM查找具体实现类

张德佑
2023-03-14

我是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);
        //...
}

和输出:

共有1个答案

濮阳奇逸
2023-03-14

要找到具体的类,您需要查看extends classimplements interfaces当您在标题中找到这些类时,您需要依次查找这些类,可能还需要查找它们的父类。

 类似资料:
  • 主要内容:JPA实体查找示例要找到一个实体,接口提供了方法,该方法根据主键搜索一个元素。 JPA实体查找示例 在这里,我们将搜索指定的记录并在控制台输出它的值。 完整的项目代码如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,它包含属性:,和。 文件:StudentEntity.java 的代码如下 - 第2步: 将实体类和其他数据库配置映射到文件中。 文件:persistence.xml 的代码

  • 如何使用NamedQuery在jointable上查找实体?我有一个抽象的父类/实体,带有@heritance(strategy=InheritanceType.JOINED)和两个子类/子实体。因此,在数据库中我有一个父表(SDR)和两个子表(xSdrs和ySdrs)。还有另一个表保留,它与表SDR有多对多关系。这就是为什么我在保留和特别提款权之间创建了一个连接表 我打算在父实体Sdr中使用Na

  • 二叉搜索树依赖于在左子树中找到的键小于父节点的属性,并且在右子树中找到的键大于父代。 我们将这个称为 bst属性。 当我们如上所述实现 Map 接口时,bst 属性将指导我们的实现。 Figure 1说明了二叉搜索树的此属性,展示了没有任何关联值的键。请注意,该属性适用于每个父级和子级。 左子树中的所有键小于根中的键。 右子树中的所有键都大于根。 Figure1 现在你知道什么是二叉搜索树,我们将

  • 本文向大家介绍ConcurrentHashMap线程安全的具体实现方式? 底层具体实现原理?相关面试题,主要包含被问及ConcurrentHashMap线程安全的具体实现方式? 底层具体实现原理?时的应答技巧和注意事项,需要的朋友参考一下 JDK1.7的ConcurrentHashMap: 首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也

  • 本文向大家介绍JS的全排列具体实现?相关面试题,主要包含被问及JS的全排列具体实现?时的应答技巧和注意事项,需要的朋友参考一下 参考回答:  

  • 问题内容: 前一段时间,我遇到了一段代码,该代码使用了一些标准Java功能来定位实现给定接口的类。我知道这些函数隐藏在某些非逻辑的位置,但是由于包名称暗含,它们可以用于其他类。那时我不需要它,所以我忘记了它,但是现在我需要了,而且似乎无法再次找到这些函数。在哪里可以找到这些功能? 编辑:我不是在寻找任何IDE函数或任何东西,而是可以在Java应用程序中执行的东西。 问题答案: 不久前,我整理了一个