您无法执行。关于生成的类文件,有几个未指定的详细信息,例如某些源代码表达式的字节码必须如何看起来准确,或者成员或属性的顺序。
由于不需要每次运行都生成完全相同的文件,因此编译器实现甚至不会尝试。可以公平地假设,当您使用完全相同的输入(不仅是相同的源代码,而且是相同的选项)执行相同的软件时,它会产生相同的输出,但这不仅需要相同的编译器版本,而且同样是JRE。
不幸的是,即使使用相同的实现和输入,也 可能 会有不同的行为。例如,
java.util.HashMap在某些Java
7实现中,尝试进行随机化,如果
javac将某些工件存储在中,也就不足为奇了
HashMap。这不适用于Java 8,但可能适用于Java
9中引入的不可变映射。编译器是否将使用该功能是不可预测的。
因此,如果您发现一个可重复生成完全相同的字节码的特定jdk版本,则现在可以使用它,但必须注意下一个版本可能没有该属性。
到目前为止,尚未解决,即使具有相同的字节码也无法保证具有相同的
jar文件,因为未指定jar文件中文件的顺序。它可能取决于系统特定的文件迭代顺序。此外,由于jar文件是存储时间戳的zip文件,因此,除非您采取其他措施(例如,对所有条目强制使用特定的时间戳),否则新编译的类文件肯定会产生不同的文件。



