Java源代码依赖关系图

问题描述 投票:0回答:4

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

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

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

我不太确定如何构建问题标题,所以如果以前有人问过类似的问题,我会很高兴您能将我链接到该问题。

java programming-languages module dependencies
4个回答
2
投票

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

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

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

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

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

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

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


1
投票

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

例如。

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

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

例如。

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

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


0
投票

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

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


0
投票

对于 2023 年或之后遇到这个问题的人来说,这项工作似乎是由 Patrick Beuks 和 Darius Sas 作为他们的 学士论文 完成的,并且代码开源。虽然通常最好在 Stackoverflow 中获得独立的答案,但如果不复制粘贴论文或代码,就无法做到这一点,这没有意义,而且是不道德的。如果您想了解代码如何工作或只是在不了解内部原理的情况下使用它,您可以研究代码。

© www.soinside.com 2019 - 2024. All rights reserved.