是否可以将.class
文件转换为.java
文件?
如何做到这一点?
从此选项中提取的代码的正确性怎么样?
答案 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月的现代反编译器列表:
您可以在线测试上面提到的反编译器,无需安装,并做出自己的教育选择。 云中的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代码的输出相同。