3

出于好奇,我刚刚使用DJ Java Decompiler以及CAVAJ Java Decompiler (Java 版本为 1.7)反编译了下面的代码,这是正常的源代码:


    byte a = 10;
    a = (byte) (a +1);

    byte b = 10;
    b = b++;

    byte c = 10;
    c +=c;

    System.out.printf("a=%d \t b=%d \t c=%d\n",a,b,c);

其中显示输出为:a=11 b=10 c=20



这是反编译的:

    byte a = 10;
    a++;
    byte b = 10;
    b++;
    b = b;
    byte c = 10;
    c += c;
    System.out.printf("a= %d \t b = %d \t c = %d\n", new Object[] {
        Byte.valueOf(a), Byte.valueOf(b), Byte.valueOf(c)
    });

其中作为源代码输出为:a=11 b=11 c=20


byte更清楚地说,这与发生的同样事情无关int,我什至在在线编译器IDEONE中检查了上述代码,并给出了与我相同的输出。

那么,反编译器是产生错误的代码还是别的什么?

4

2 回答 2

4

我会给你一个简短的回答:是的,似乎反编译器产生了错误的代码。因为这个:

byte b = 10;
b = b++;

具有强烈的预测行为(b不会改变)。

UPD:此外,没有一个反编译器可以 100% 保证生成的反编译代码的正确性。

UPD-2:您确定您向我们提供了您的代码的实际版本吗?因为这个:

byte aa = 10;
a = (byte) (a +1);

当然是一个错误。它甚至不会编译:)

UPD-3好吧,我需要说,那个Jad反编译器(用于 Intel 平台上的 Windows 9x/NT/2000 的 Jad 1.5.8g)产生相同的代码:

    byte b = 10;
    b++;
    b = b;

...

    java.lang.System.out.printf("a=%d \t b=%d \t c=%d\n", new java.lang.Object[] {...

但这并不奇怪:Cavaj Java 反编译器使用 Jad 作为其 Java 反编译引擎

结论:将此行为视为Jad反编译器的功能/错误,这远非完美。

于 2013-01-18T18:52:22.680 回答
-2

这与反编译器无关。当您使用 java 编译器编译代码时,在某些情况下,编译器会更改您的代码并将其优化为另一个不会更改结果的代码。你的代码是:

byte a = 10;
a = (byte) (a + 1);

在这种情况下,java 编译器知道不需要在字节和字节之间进行类型转换,因此,编译器会尝试删除您的类型转换,并且在此过程中,它会用它可以理解的最接近的代码替换您的代码。这是编译器输出:

byte a = 10;
a++;

因此,这与反编译过程无关。Java 编译器会更改您的代码。

于 2013-01-18T19:26:30.110 回答