【发布时间】:2015-02-20 05:41:12
【问题描述】:
我试图通过反编译 .class 文件来了解 Java 编译器的工作原理。我使用了 Java 反编译器 (http://jd.benow.ca/) 和 showmycode (http://www.showmycode.com/) 他们在 .java 文件中向我展示了不同的源代码。 为什么?我应该相信哪个。
.java 文件
class HelloWorld{
public static void main(String[] args){
System.out.println("Hello, World!");
}
}
java反编译器反编译的.class文件:
import java.io.PrintStream;
class HelloWorld
{
public static void main(String[] paramArrayOfString)
{
System.out.println("Hello, World!");
}
}
由showmycode反编译的.class文件
import java.io.PrintStream;
class HelloWorld {
HelloWorld() {
}
public static void main(string args[])
{
system.out.println("Hello, World!");
}
}
【问题讨论】:
-
反编译器生成的代码试图与原始代码做相同的事情,它不会重新生成确切的原始代码。如果我只能说三个数字加起来等于 10,那么我使用 [2,4,4]、[1,2,7] 或 [3,4,3] 来到达那里没有什么区别;它们都产生与执行原始公式时相同的输出。
-
如果您想了解编译器的工作原理,请使用反汇编程序查看生成的实际字节码。理想情况下,不要使用
javap,因为它会隐藏东西。
标签: java compiler-construction decompiling decompiler