【发布时间】:2016-04-07 14:41:14
【问题描述】:
在我的情况下,我在构建过程中创建了许多 .jar 文件。在进行任何调试之前,我想要一种方法来快速验证我的.java 源是否与.jar 中的.class 匹配。
我认为,如果我解压缩.jar 并找到与我的.java 文件匹配的.class,那么我应该能够确定它们在功能上是否相同。
我该怎么做?
【问题讨论】:
标签: java jar .class-file
在我的情况下,我在构建过程中创建了许多 .jar 文件。在进行任何调试之前,我想要一种方法来快速验证我的.java 源是否与.jar 中的.class 匹配。
我认为,如果我解压缩.jar 并找到与我的.java 文件匹配的.class,那么我应该能够确定它们在功能上是否相同。
我该怎么做?
【问题讨论】:
标签: java jar .class-file
首先要意识到编译不只是使用特定的 .java 文件来编译正在编译的类。编译器还使用编译时可用的其他 .java 和 .class 文件中的信息。例如,它可以内联静态最终常量。此外,诸如方法重载之类的东西取决于已定义的方法。
话虽如此,如果您使用与以前相同的编译器编译相同的源文件,您可能会得到相同或非常相似的类文件。但是,即使源文件相同,不同的编译器(javac vs eclipse)和不同版本的编译器也会产生不同的结果。
因此,我建议首先尝试编译所有内容并查看类文件是否匹配。如果类文件不匹配,请尝试使用 Krakatau 反汇编程序对它们进行反汇编,并对反汇编进行比较,看看有什么不同。这将帮助您查看差异是否不重要(例如常量池的重新排序)或字节码是否有实质性更改。
【讨论】:
你可以使用像http://jd.benow.ca/这样的java反编译器,以便能够查看你的类文件的相应源代码,然后你就可以将它与你的java文件进行比较
【讨论】:
如果您可以使用反编译器,也许对您来说就足够了?就像来自 IntelliJ IDE 的一个,看看你编译的类的源代码是怎样的。您甚至可以调试反编译的源代码。
【讨论】: