繁体   English   中英

Java源代码依赖图

[英]Java source code dependency graph

嗯,首先,这可能是愚蠢和疯狂的。

我正在尝试构建(或使用,如果已经存在)一个框架,它接收许多Java源文件并输出这些文件交互的方式; 例如,file1.java可以导入 file2.java; file2.java可以从file3.java调用静态方法。 如果可以在不编译或运行文件集的情况下完成,那么理想情况下会很棒。 我知道Reflection API允许我探索一个类的部分,但这是我在寻找什么?

另外,这有多难扩展到其他语言,例如Python或Lisp(在这里添加任何其他语言)?

我不太确定如何构建问题标题,所以如果以前曾经问过这样的问题,我很高兴你能把我链接到那个问题。

我目前正在开发一个项目,主要功能与你提到的非常相似,我使用的是javaparser: http//code.google.com/p/javaparser/

javaparser非常强大,它可以帮助我们很多源代码分析,但即使我使用javaparser也很难获得完整的依赖关系和类交互。

例如:如果要获取类的所有依赖项,最直接的方法是获取源代码的“导入”区域 - 使用javaparser非常容易。

但只有“导入”是不够的,如果您正在分析的类 - ClassA - 被称为类 - ClassB - 与ClassA在同一个包中,那么ClassB将不会出现在导入区域中。

所以在这种情况下,我们无法获得ClassB依赖。

对于类的交互,如果你不能100%获得一个类的正确依赖,那么你不能100%知道类之间正确的交互。

但无论如何,到目前为止,javaparser是我能找到的最强大,最有用的java源代码分析工具。

你问了两个问题,我会尝试解决第一个问题。 我相信你正在对java文件做一些源代码分析,看看它们是如何相互交互的(至少这是我所理解的)所以基本上这样做你必须像Eclipse IDE一样。 扫描每个.java文件中的源代码,并构建java保留字和构造的数据结构。 分析每个.java文件后,您可以继续发现它们之间的链接。

恩。

  1. 存储类的包名称及其名称和范围
  2. 存储所有声明的变量,它们的值及其范围的HashMap
  3. 发现源文件中的方法并将其名称存储在+ out参数和范围中

您还可以做更多的事情并检测这些构造,您必须编写自己的(或在网上找到某些东西)解析器并使用正则表达式来检测这些。 您将它们存储在程序中,然后在分析完所有源文件后,您就可以开始查看交互了。

恩。

源文件1在包xy中,有3个公共方法和2个包范围方法。 源文件2在包z中,有1个公共方法和3个私有方法。

因此,您可以得出结论,文件1可以通过调用该公共方法与文件2进行交互。 您可以对所有文件执行相同的分析。

我知道你说你不想做编译,但是查看类文件要容易得多。 在字节码和常量池之间,您可以获得所需的一切,而无需基本上重写javac。 使用Apache BCEL,你就在那里。 显然,没有工具能够找到通过反射访问的依赖项; 为此,您需要使用自定义类加载器或其他东西进行运行时分析。

https://en.wikipedia.org/wiki/Java_class_file http://commons.apache.org/proper/commons-bcel/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM