Java 源代码依赖关系图



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

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

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

真的不确定如何构建问题标题,所以如果以前有人问过这样的事情,我很高兴你能将我链接到这个问题。

我目前正在做一个项目,main函数与你提到的非常相似,我使用javaparser http://code.google.com/p/javaparser/:

javaparser

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

例如:如果你想获取一个类的所有依赖关系,最直接的方法是获取源代码的"导入"区域——这通过使用Javaparser非常容易。

但是只有"导入"是不够的,如果类 - 类 - 你目前正在分析的类 - 与类 A 在同一个包中,那么类 B 不会出现在导入区域中。

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

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

但不管怎么说,到目前为止,javaparser是我能找到的最强大、最有用的Java源代码分析工具。

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

前任。

  1. 存储类的包名称及其名称和作用域
  2. 存储所有声明变量、其值和范围的哈希图
  3. 发现源文件中的方法并存储其名称、输入 + out 参数和范围

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

前任。

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

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

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

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

对于在 2023 年或之后遇到这个问题的人来说,这项工作似乎是由 帕特里克·博克斯 和 大流士·萨斯 作为他们的学士学位论文完成的,并且代码是开源的。虽然在 Stackoverflow 中拥有独立的答案通常更可取,但如果不复制粘贴论文或代码,这里就没有办法做到这一点,这是没有意义的,也是不道德的。

编辑:

我尝试使用该软件,但它需要从源代码构建,并且做出了幼稚的假设,导致构建失败。因此,像许多学术项目一样,如果没有用户投入的大量时间和精力,这个项目也无法工作。

您想扫描源代码,但有一种流行的开源软件可以扫描类文件。https://github.com/classgraph/classgraph

最新更新