【问题标题】:decompiled code is different from original code反编译代码与原始代码不同
【发布时间】:2017-10-30 09:15:27
【问题描述】:

我使用jd-gui 反编译了一个.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();
    

为什么会这样?

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

【问题讨论】:

  • 如果没有大括号,if语句在第一个';'处结束遇到了,所以就在 continue 关键字后面
  • 因为无法从编译后的代码中获取原始源代码。
  • 我知道if 语句是如何工作的并且无法获得原始代码,但我仍然想知道!= 被转换为== continue;。这个改动是编译器做的?
  • 编译器将根据提供给它的编码标准修改我们的代码,在这种情况下你不应该使用括号。同样明智的是,如果您不添加超类构造函数,它将添加。
  • @RohanKishibe 是的。

标签: java decompiler


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    反编译代码总是试图做与源代码相同的事情,但由于编译器的优化,它以不同的方式编写。他们是一些比其他更好的反编译器,检查article

    【讨论】:

    • “反编译代码总是和源代码做同样的事情......”。不必要。有时反编译的代码不是有效的 Java。其他时候可能不正确。一个好的混淆器会尽力确保其中一个或两个是真实的。但是即使对于非混淆代码,反编译器也可能会出错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2012-04-10
    • 2017-08-06
    • 1970-01-01
    相关资源
    最近更新 更多