【问题标题】:Compare .java file to .class file比较 .java 文件和 .class 文件
【发布时间】:2016-04-07 14:41:14
【问题描述】:

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

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

我该怎么做?

【问题讨论】:

标签: java jar .class-file


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    你可以使用像http://jd.benow.ca/这样的java反编译器,以便能够查看你的类文件的相应源代码,然后你就可以将它与你的java文件进行比较

    【讨论】:

    • 这大概就是我要走的路。我希望实现自动化,而不必进行视觉验证。
    • @flkes 抱歉,AFAIK 即使您打算自动进行反编译(这应该是可能的),也无法自动化它,因为反编译器提供的结果与源代码中的结果不完全一样,例如您没有任何 javadoc。
    • 也许我可以使用 .jar 作为类路径来编译我的 .java 文件并比较 .class 文件?
    • 假设你的jar没有任何依赖并且你使用完全相同版本的JVM编译,它确实可以工作
    • @flkes:“也许我可以使用 .jar 作为类路径来编译我的 .java 文件并比较 .class 文件?”也许你应该重新考虑你的起点。您想确保类是最新的,现在您将重新编译所有内容并然后开始尝试比较结果。即使这种比较不容易出错,重新编译所有内容还不足以确保所有内容都是最新的吗?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 2012-10-23
      • 2019-04-04
      • 2018-04-01
      • 2018-07-31
      相关资源
      最近更新 更多