java - java .class 文件在不同编译器、版本、依赖项之间的差异是什么?

标签 java class compiler-construction md5 bytecode

您好,我想知道有多少 Java 类文件在不同的编译器之间发生了变化。那么,如果 .java 文件是由 Sun JDK 1.4、1.5、1.6 甚至 IBM JDK 编译的,实际字节数会发生多少变化。我知道类文件在调试信息和混淆方面可能有所不同,但让我们假设这些选项相同的问题,因此包括调试信息,没有混淆。如果我在 JDK 1.4 编译的 .class 文件上运行 MD5 或 SHA-1,如果我在 JDK 1.5 中编译它但以 1.4 为目标,则哈希会有所不同当以 JDK 1.5 为目标时会怎样?

同样与此相关的是,当使用不同的依赖项时,类文件的二进制文件是否会更改,或者以不同的方式询问类文件的二进制文件是否可以根据其依赖项更改?

最后但并非最不重要的是,是否有编程方法来分析 .class 文件的元数据,以便识别编译器版本和/或编译时使用的开关?

最佳答案

Java 编译器在从源代码创建类和字节码时有相当大的自由度。他们可以重新排序方法,重新排序常量池(使用类名、方法名和字符串——这也会导致不同的方法字节码)并重新排序实际的字节码命令,只要执行它们时的结果是相同的。

因此,使用 MD5 或类似的哈希值来证明两个类文件来自同一来源并不是很明智。

关于java - java .class 文件在不同编译器、版本、依赖项之间的差异是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5453012/

相关文章:

visual-studio-2005 - Visual Studio,如何输出构建所花费的时间?

java - 修复intellij中的ClassNotFoundException

Java和Firebird Embedded如何设置?

c++ - 推广结构访问的有效且实用的方法?

c - 是否有像 gccxml 这样的用于包装器生成的 C header 解析器工具?

JavaScript 字节码编译器?

java - 从可运行/TimerTask 中检索字符串

java - Admob 插页式广告显示在游戏中间

c++ - C++类方法定义语法

python - 在 Python 类中编写 __init__ 方法的文档字符串的首选位置在哪里?