查找Java类中的所有依赖项

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

我终于找到了解决方案。 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代码,您可以轻松了解它的function并根据您的需要进行修改。 在我的示例类上运行它,它给了我很好的,有用的输出: [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] 。 它包含我使用的每个类和接口以及用于generics参数化的每种类型。