1

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

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

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

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

4

3 回答 3

2

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

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

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

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

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

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

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

于 2012-09-20T14:35:19.117 回答
1

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

前任。

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

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

前任。

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

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

于 2012-07-04T04:45:07.943 回答
0

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

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

于 2013-05-21T17:04:24.583 回答