是否可以将
.class
文件转换为 .java
文件?
这怎么办?
从该选项中提取的代码的正确性如何?
这是可能的。您需要一个 Java 反编译器来执行此操作。
您会发现它的工作效果出奇的好。您将得到一个有效的
.java
文件,它将编译为 .class
文件,但这个 .java
文件不一定与原始源代码相同。像循环构造这样的东西可能会出现不同的结果,并且任何仅在编译时发生的东西(例如泛型和注释)都不会被重新创建。
如果代码已被混淆,您可能会遇到问题。这是一个改变类文件以使其难以反编译的过程。例如,类和变量名称都更改为相似,因此您最终会得到类似
aa.a(ab)
而不是 employee.setName(name)
的代码,并且很难弄清楚发生了什么。
我记得使用 JAD 来执行此操作,但我不认为这是积极维护的,因此它可能不适用于从未版本的 Java。 Google 搜索 java decompiler 会给你很多选择。
这可以使用可用的 Java 反编译器 之一来实现。由于您正在使用可能已被编译器优化的字节码(内联静态变量、重构控制流等),您得到的结果可能与最初编译的代码不完全相同,但它在功能上是等效的。
补充之前的答案:最近,新一波反编译器来了,分别是Procyon、CFR、JD、Fernflower
以下是截至 2015 年 3 月的现代反编译器列表:
您可以在线测试上述反编译器,无需安装并做出您自己的明智选择。 云端 Java 反编译器: http://www.javadecompilers.com/
这总是可能的。搜索“java 反汇编器”。
但是源代码注释和临时变量将不可用。
如果反编译一个类,发现代码过于复杂,变量名、方法名都是a、b、c……,说明该项目被混淆了。
不完全是一个反编译器,但是JDK包含javap,一个反汇编器:
javap -c org.example.MyClass
根据您的用例,了解或使用可能仍然很有趣。
请注意,类文件反编译的结果取决于类文件中包含的信息。如果我没记错的话,包含的调试信息(参见 javac 的 -g 标志)很重要,特别是对于变量的命名等。
我使用过intellij idea社区版,我注意到我也可以打开.class文件,并且反编译的代码与我编码的代码完全相同。
虽然我不确定这是否是由于在打开它的同一个IDE中编译到.class文件所致。
结果的准确性也可能因其他用例而异。