将 .java 文件与 .class 文件进行比较

Compare .java file to .class file

在我的情况下,我有许多 .jar 文件是从构建过程中创建的。在我进行任何调试之前,我想要一种方法来快速验证我的 .java 源是否与 .jar 中找到的 .class 相匹配。

我想如果我解压缩 .jar 并找到与我的 .java 文件匹配的 .class 那么我应该能够确定它们在功能上是否相同。

我该怎么做?

您可以使用 java 反编译器,例如 http://jd.benow.ca/,以便能够查看 class 文件的相应源代码,然后您就可以将其与 java 文件

如果你能使用反编译器,也许对你来说就足够了?喜欢来自 IntelliJ IDE 的一个,看看你的源代码是如何编译的 class。您甚至可以调试反编译的源代码。

首先要认识到的是,编译不只是为正在编译的 class 使用特定的 .java 文件。编译器还使用编译时可用的其他 .java 和 .class 文件中的信息。例如,它可能内联静态最终常量。此外,方法重载之类的东西取决于定义了哪些方法。

也就是说,如果您使用与以前相同的编译器编译相同的源文件,您可能会得到相同或非常相似的 class 文件。然而,即使使用相同的源文件,不同的编译器(javac vs eclipse)和不同版本的编译器也会产生不同的结果。

因此,我建议首先尝试编译所有内容并查看 class 文件是否匹配。如果 class 文件不匹配,请尝试使用 Krakatau 反汇编器反汇编它们,并对反汇编进行比较以查看差异。这将帮助您了解差异是否不重要(例如常量池的重新排序)或字节码是否有实质性更改。