Java 反编译代码与原始代码不同

Java 反编译代码与原始代码不同,java,decompiler,Java,Decompiler,我使用jdgui反编译了一个.jar文件,并检查了代码,发现它与原始.java文件不同 原始代码 if ( total != 0 ) { result[ i ] = bdResult.multiply( bdItem ).divide( bdTotal, 0, RoundingMode.DOWN ).setScale( 0, RoundingMode.DOWN ).intValue(); } 反编译代码 if (total == 0) continue; result[

我使用
jdgui
反编译了一个
.jar
文件,并检查了代码,发现它与原始
.java
文件不同

  • 原始代码

    if ( total != 0 ) {
        result[ i ] = bdResult.multiply( bdItem ).divide( bdTotal, 0,
        RoundingMode.DOWN ).setScale( 0, RoundingMode.DOWN ).intValue();
    }
    
  • 反编译代码

    if (total == 0)
      continue;
    result[i] = bdResult.multiply(bdItem).divide(bdTotal, 0, 
    RoundingMode.DOWN).setScale(0, RoundingMode.DOWN).intValue();
    
为什么会发生这种情况


此外,反编译代码在语法上似乎是错误的(花括号在哪里?

不可能通过反编译获得原始代码,因为不同的代码可能导致相同的java字节码语句。但是,您会得到一个与原始版本完全相同的版本,它执行的操作与原始版本完全相同。

反编译代码总是尝试执行与源代码相同的操作,但由于编译器的优化,它们以不同的方式编写。它们是一些比其他更好的反编译器,检查

如果没有花括号,if语句在第一个“;”结束这是遇到的,所以就在continue关键字后面,因为不可能从编译后的代码中获取原始源代码。我知道如果语句工作并且无法获取原始代码,那么
是如何工作的,但我仍然想知道
=转换为
==继续。此更改是由编译器进行的?编译器将根据提供给它的编码标准修改我们的代码,在这种情况下,您不应该使用括号。如果不添加超级类构造函数,它将添加。@RohanKishibe yes。“反编译代码总是做与源代码相同的事情……”。不一定。有时反编译的代码不是有效的Java。其他时候可能不正确。一个好的混淆器会尽最大努力确保其中一个或两个都是正确的。但反编译器可能会出错,即使是对于未混淆的代码。