6

我正在尝试获取 Java 类中的所有依赖项,包括用于泛型参数化和局部变量类型的类。到目前为止,我发现的最好的框架是 apache bcel。使用它,我可以轻松地从字节码中找到所有字段、方法参数和局部变量。基本上除了泛型和局部变量类型之外的所有内容。例如,从行List<Point> points = new ArrayList<Point>();中我只能找到一个依赖项 - 使用JavaClass.getConstantPool()bcel 方法的 ArrayList。它既检测不到 List 接口也检测不到 Point 类。我还尝试了tattletale和 CDA,不幸的是没有成功(结果相同)。检查导入是不够的——我还需要来自同一个包的依赖项,而且我不能接受通配符。如果有任何帮助,我将不胜感激。

4

1 回答 1

8

我终于找到了解决方案。ASM Bytecode Framework是正确使用的工具。使用官方教程和正确的示例很容易获得所有需要的依赖项。在示例中,已经有一个访问者类DependencyVisitor可以满足我的要求。为了获得正确的格式,我只需要更改DependencyVistitor示例代码中的一种方法,因此它添加了完整的类名,而不仅仅是包:

private String getGroupKey(String name)
{
        //Just comment that block so you can get full class names instead of package only
        /*
        int n = name.lastIndexOf('/');
        if (n > -1)
        {
            name = name.substring(0, n);
        }
       */
        // Replace resource char with package separator char        
        packages.add(name.replace("/", "."));
        //packages.add(name);
        return name;
}

查看DependencyVisitor代码,您可以轻松了解它的作用并根据您的需要对其进行修改。在我的示例类上运行它会给我很好的、有用的输出: [java.util.ArrayList, java.lang.Object, java.util.List, java.awt.Point, goobar.test.asmhello.TestClass, java.lang.String, java.lang.Integer, java.awt.Graphics, goobar.test.asmhello.TestClass2]. 它包含我使用过的每个类和接口以及用于泛型参数化的每个类型。

于 2013-06-29T12:04:26.977 回答