2013-06-28 70 views
4

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

+0

你想在运行时从字节码做到这一点?编译时? –

+0

我想找到所有静态依赖项(不是运行时)。读字节码可能是最好的想法。但我也可以尝试解析源代码(它似乎并不是最好的想法,我还没有找到任何解决方案)。 – goobar

+0

并非所有的源依赖项都需要放在类文件中(方法中的泛型类型,内联常量)。只需在一个体面的文本编辑器或UNIX'strings'中查看类文件即可。 –

回答

5

我终于找到解决方案。 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]。它包含我用过的每个类和接口以及用于泛型参数化的每种类型。

+0

完美,以前没有遇到过这样的问题,通常通过注释来识别,但这很酷,谢谢 – 2013-06-29 15:36:14

+0

示例代码已移到[here](http://websvn.ow2.org/listing.php?repname=asm&path =%2Ftrunk%2Fasm%2Fexamples%2Fdependencies%2Fsrc%2Forg%2Fobjectweb%2Fasm%2Fdepend%2F)。 – seanf