24

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

如何才能做到这一点?

从这个选项中提取的代码的正确性如何?

4

6 回答 6

25

有可能的。您需要一个 Java 反编译器来执行此操作。

你会发现大多数情况下它会做得非常好。您将得到一个有效.java文件,该文件将编译为该.class文件,但该.java文件不一定与原始源代码相同。诸如循环构造之类的东西可能会以不同的方式出现,并且任何仅在编译时(例如泛型和注释)都不会被重新创建。

如果代码被混淆,您可能会遇到问题。这是一个更改类文件以使其难以反编译的过程。例如,类名和变量名都更改为相似,因此您最终会得到类似aa.a(ab)而不是的代码,employee.setName(name)并且很难弄清楚发生了什么。

我记得使用JAD来执行此操作,但我不认为这是积极维护的,因此它可能不适用于从未使用过的 Java 版本。谷歌搜索 java 反编译器会给你很多选择。

于 2009-12-02T10:28:46.747 回答
2

这可以使用一种可用的Java 反编译器来实现。由于您使用的字节码可能已被编译器优化(内联静态变量、重构控制流等),因此您得到的结果可能与最初编译的代码不完全相同,但在功能上是等效的。

于 2009-12-02T10:36:17.363 回答
2

补充前面的答案:最近,新一波反编译器来了,分别是 Procyon、CFR、JD、Fernflower

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

  • 南河四
  • 病死率
  • 京东
  • 蕨花

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

于 2015-03-20T04:36:12.710 回答
0

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

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

如果你反编译一个类,发现代码太复杂,变量名和方法名像 a,b,c...,这意味着项目被混淆了。

于 2009-12-02T10:35:36.240 回答
0

不完全是反编译器,但JDK 包含 javap,一个反汇编器

javap -c org.example.MyClass

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

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

于 2009-12-02T10:41:49.413 回答
0

DJ是易于使用的 java反编译器。只需打开任何 .class 文件,它就会显示它的java代码。

另外,你可以使用eclipse的jadClipse插件直接将.class反编译成.java

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

于 2009-12-02T10:51:12.537 回答