是否可以将文件转换.class
为.java
文件?
如何才能做到这一点?
从这个选项中提取的代码的正确性如何?
有可能的。您需要一个 Java 反编译器来执行此操作。
你会发现大多数情况下它会做得非常好。您将得到一个有效.java
文件,该文件将编译为该.class
文件,但该.java
文件不一定与原始源代码相同。诸如循环构造之类的东西可能会以不同的方式出现,并且任何仅在编译时(例如泛型和注释)都不会被重新创建。
如果代码被混淆,您可能会遇到问题。这是一个更改类文件以使其难以反编译的过程。例如,类名和变量名都更改为相似,因此您最终会得到类似aa.a(ab)
而不是的代码,employee.setName(name)
并且很难弄清楚发生了什么。
我记得使用JAD来执行此操作,但我不认为这是积极维护的,因此它可能不适用于从未使用过的 Java 版本。谷歌搜索 java 反编译器会给你很多选择。
这可以使用一种可用的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 标志)很重要,尤其是对于变量的命名等。