不同编译器,版本,依赖项中java .class文件的差异是什么?

AGr*_*ald 1 java compiler-construction md5 bytecode class

嗨,我想知道有多少Java类文件在不同的编译器中发生变化.因此,如果.java文件是由Sun JDK 1.4,1.5 1.6甚至IBM JDK编译的,那么实际字节的变化量是多少.我知道类文件在调试信息和模糊处理方面可能有所不同,但我们假设这些选项是相同的,所以包含调试信息,没有混淆.如果我在JDK 1.4编译的.class文件上运行了MD5或SHA-1,那么如果我在JDK 1.5中编译它,那么Hash会有所不同,但是当定位JDK 1.5时,目标是1.4吗?

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

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

Paŭ*_*ann 5

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

因此,使用MD5或类似的哈希来证明来自同一来源的两个类文件并不是真的合理.