Java源代码依赖图

时间:2012-07-04 03:20:14

标签: java programming-languages module dependencies

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

离。

  1. 存储类的包名称及其名称及其范围
  2. 存储所有已声明变量的HashMap,其值及其范围
  3. 发现源文件中的方法并将其名称存储在+ out参数和范围
  4. 你可以做更多的事情并且要检测这些构造,你必须自己编写(或在网上找到一些东西)解析器并使用正则表达式来检测这些。您将它们存储在程序中,然后在分析完所有源文件后,您就可以开始查看交互。

    离。

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

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

答案 1 :(得分:0)

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

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