字节代码到Java源代码

时间:2009-12-02 10:26:33

标签: java bytecode

是否可以将.class文件转换为.java文件?

如何做到这一点?

从此选项中提取的代码的正确性怎么样?

6 个答案:

答案 0 :(得分:20)

有可能。您需要Java Decompiler才能执行此操作。

你会发现它大部分都会做得非常出色。您将获得的是一个有效的.java文件,该文件将编译为.class文件,但此.java文件不一定与原始源代码相同。循环结构之类的东西可能会有所不同,并且不会重新创建任何编译时间,例如泛型和注释。

如果the code has been obfuscated,您可能会遇到问题。这是一个改变类文件以使其难以反编译的过程。例如,类和变量名称都会更改为相似,因此您最终会得到aa.a(ab)而非employee.setName(name)之类的代码,并且很难弄清楚正在发生的事情。

我记得使用JAD来执行此操作,但我不认为这是主动维护的,因此它可能不适用于从未版本的Java。 Google search for java decompiler会给你很多选择。

答案 1 :(得分:2)

可以使用其中一个Java decompilers。由于您使用的字节代码可能已经被编译器优化(内联静态变量,重构控制流等),因此您获得的内容可能与最初编译的代码不完全相同,但它在功能上是等效的。

答案 2 :(得分:2)

添加到之前的答案:最近,新的反编译浪潮即将来临,即Procyon,CFR,JD,Fernflower

以下是截至2015年3月的现代反编译器列表:

  • 南河
  • CFR
  • JD
  • Fernflower

您可以在线测试上面提到的反编译器,无需安装,并做出自己的教育选择。 云中的Java反编译器: http://www.javadecompilers.com/

答案 3 :(得分:0)

总是可能的。搜索“java反汇编程序”。

但源代码注释和临时变量将不可用。

如果您反编译一个类,并且看到代码太复杂,变量名称和方法名称就像a,b,c ......这意味着项目被混淆了。

答案 4 :(得分:0)

不完全是反编译器,而是JDK contains javap, a disassembler

javap -c org.example.MyClass

根据您的使用情况,了解或使用它可能仍然很有趣。

请注意,类文件反编译的结果取决于类文件中包含的信息。如果我没记错的话,包含的调试信息(see -g flag of javac)很重要,特别是对于变量的命名等。

答案 5 :(得分:0)

DJ是易于使用的java decompiler。只需打开任何.class文件,它将显示其java代码。

此外,您可以使用jadClipse插件为eclipse直接将.class反编译为.java

What about the correctness of the code extracted from this option?
在任何情况下,任何java反编译器生成的代码都不会与原始java类中编写的代码相同。因为它只是将字节码解码为java代码。唯一可以肯定的是,输出将与原始java代码的输出相同。