我试图获得Java类中的所有依赖项,包括用于泛型参数化和局部变量类型的类。到目前为止,我发现的最好的框架是apache bcel。使用它我可以很容易地从字节代码中找到所有字段,方法参数和局部变量。基本上除了泛型和局部变量类型以外的所有东西。例如,从行List<Point> points = new ArrayList<Point>();
我只能找到一个依赖项 - ArrayList使用bcel中的JavaClass.getConstantPool()
方法。它既不能检测到List接口也不能检测Point类。我也试过tattletale和CDA,不幸的是没有成功(结果相同)。检查导入是不够的 - 我还需要来自同一个包的依赖项,我不能接受通配符。我会很感激任何帮助。查找Java类中的所有依赖关系
回答
我终于找到解决方案。 ASM Bytecode Framework
是正确的使用工具。使用官方tutorial和右边example很容易获得所有需要的依赖关系。在这个例子中,已经有一个访问者类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-29 15:36:14
示例代码已移到[here](http://websvn.ow2.org/listing.php?repname=asm&path =%2Ftrunk%2Fasm%2Fexamples%2Fdependencies%2Fsrc%2Forg%2Fobjectweb%2Fasm%2Fdepend%2F)。 – seanf
- 1. 查找所有函数依赖关系
- 2. 查找单个类的所有依赖关系
- 3. 按类名查找pom依赖关系
- 4. 查找YouTube依赖关系
- 5. 查找dll依赖关系
- 6. 查找列依赖关系
- 7. 查找AAR依赖关系
- 8. 查找verilog中的所有依赖关系编译
- 9. 如何在sql server中查找表的所有依赖关系
- 10. 反向检查ArrayList中的所有依赖关系java
- 11. 查找系统的依赖关系
- 12. Java - 如何查找类和其他级别的依赖关系
- 13. 如何查找数据库表的所有依赖关系?
- 14. 查找存储过程列表的所有依赖关系
- 15. 如何查找应用程序的所有依赖关系?
- 16. 在JAR中查找依赖关系
- 17. 如何查找java类依赖关系树
- 18. 如何找到Java类的所有引用(即依赖关系,传入耦合)?
- 19. 如何检查库中的类与java中的依赖关系
- 20. Java类的绘制依赖关系图
- 21. 在Java中查找依赖关系的具体时间
- 22. 在Java中查找eclipse/jdt的jar依赖关系
- 23. 我如何找到Java依赖关系?
- 24. 解决所有的maven依赖关系
- 25. 依赖关系的nuget依赖关系
- 26. SQL查询获取所需的DLL的所有依赖关系
- 27. 查找Maven依赖项对象的依赖关系
- 28. 在c中查找类的依赖关系#
- 29. 使用Perl查找有向图中的所有循环依赖关系
- 30. 查找DISTINCT缺少SQL依赖关系
你想在运行时从字节码做到这一点?编译时? –
我想找到所有静态依赖项(不是运行时)。读字节码可能是最好的想法。但我也可以尝试解析源代码(它似乎并不是最好的想法,我还没有找到任何解决方案)。 – goobar
并非所有的源依赖项都需要放在类文件中(方法中的泛型类型,内联常量)。只需在一个体面的文本编辑器或UNIX'strings'中查看类文件即可。 –