在我的团队中,我们使用的是 java 1.4.2 大多数机器 for 循环都被编译为 only.ie。如果我反编译类文件,我只能看到 for 循环,但某些开发人员的某些机器会变成 do while 循环。即当我反编译某些类时,它变成了 do while
怎么会发生?任何可能的原因、Java 版本或任何机构都可以想到的配置,因此我可以重现此缺陷并在所有开发人员机器中修复它
我不会称之为缺陷。当您将 Java 编译为字节码时,一些信息会丢失。当您随后反编译字节码时,无法保证生成的 Java 源代码与您开始使用的源代码非常匹配。
特别是,字节码语言没有针对不同类型循环的特定指令。Java 循环被编译成使用比较指令和跳转的字节码。在决定使用哪种类型的循环来生成给定的字节码时,反编译器必须做出有根据的猜测。
机器之间的行为差异可能与这些机器上安装的编译器和反编译器的确切版本的差异有关,或者可能与这些工具的配置方式有关。
while
和的代码for
是可互换的,并且无法从字节码中分辨出使用了哪个(您可以推断出来)您无法从字节码中重现注释,并且您无法可靠地区分 for 和 while 循环之间的区别。
例如
while(condition)
和
for(;condition;)
和
while(true) {
if(!condition) break;
}
是相同的。
在字节码中,没有循环,只有条件跳转和无条件跳转(又名 gotos)。因此,反编译器尽最大努力重建基于跳转结构的循环。
编译器优化永远不会改变代码的实际作用。
即使不同的编译器对您的代码进行不同的优化,程序的语义也永远不会有任何差异:用户总是会得到相同的结果。
这不是需要修复的错误。没有解决办法。没有错误。
这可能是由编译器的optimization settings
. 检查不同机器上的优化设置。尝试禁用所有优化或等于优化级别。