字节码转换为Java源代码

25

是否有可能把.class文件转化成.java文件?

如何实现这个操作?

从这种方式提取的代码正确吗?

6个回答

27
可以。您需要使用Java反编译器来完成此操作。
大多数情况下,它会做出令人惊讶的好工作。您将获得一个有效的.java文件,它将编译为.class文件,但这个.java文件不一定与原始源代码相同。例如,循环结构可能会以不同的方式出现,而任何仅在编译时存在的内容(例如泛型和注释)都不会被重新创建。
如果代码已经混淆,则可能会遇到问题。这是一种改变类文件以使其难以反编译的过程。例如,类和变量名称都被更改为相似的名称,因此您最终会得到像aa.a(ab)这样的代码,而不是employee.setName(name),很难弄清楚正在发生什么。
我记得使用JAD来完成此操作,但我认为它没有得到积极维护,因此可能无法与Java的新版本一起使用。Google搜索Java反编译器将为您提供丰富的选择。

2

除了之前的回答,最近出现了一批新的反编译器,包括Procyon、CFR、JD和Fernflower。

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

  • Procyon
  • CFR
  • JD
  • Fernflower

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


2

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


0

这是完全可能的。搜索“Java 反汇编器”。

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

如果你反编译一个类并发现代码过于复杂,变量名和方法名像 a、b、c... 这样,那就意味着该项目已经被混淆了。


我认为并不保证总是可能的。我认为有一些字节码结构在Java中没有等价物,还有一些从其他源(如Scala)生成.class文件的语言/工具。 - user85421
我也是这么认为...但是OP没有提到这个.class文件是否是直接从Java创建的。谢谢... - user85421
当然可以,但是java标签只能用于目标文件(.java)。它并不表示.class是由Java生成的...你读过问题吗:--)我肯定是我的错,因为我的英语很糟糕(既不是第一语言也不是第二语言),但我确定这不是这种讨论的正确媒介,也没有任何进展...我退出了! - user85421

0

虽然不是一个反编译器,但JDK 包含 javap,一种反汇编工具

javap -c org.example.MyClass

根据您的用例,了解或使用此内容可能仍然是有趣的。

请注意,类文件反编译的结果取决于类文件中包含的信息。如果我记得正确的话,包含调试信息(参见 javac 的 -g 标志)非常重要,特别是对于变量命名等方面。


0

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

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

这种选项提取的代码正确吗?
无论如何,任何Java反编译器生成的代码都不会与原始Java类中编写的代码相同。因为它只是将字节码解码为Java代码。您唯一可以确定的是,输出将与原始Java代码的输出相同。


+1 表示输出将与原始 Java 代码的输出相同 - Sachin Chourasiya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接