字节码到Java源代码

问题描述 投票:0回答:7

是否可以将

.class
文件转换为
.java
文件?

这怎么办?

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

java bytecode
7个回答
27
投票

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

您会发现它的工作效果出奇的好。您将得到一个有效的

.java
文件,它将编译为
.class
文件,但这个
.java
文件不一定与原始源代码相同。像循环构造这样的东西可能会出现不同的结果,并且任何仅在编译时发生的东西(例如泛型和注释)都不会被重新创建。

如果代码已被混淆,您可能会遇到问题。这是一个改变类文件以使其难以反编译的过程。例如,类和变量名称都更改为相似,因此您最终会得到类似

aa.a(ab)
而不是
employee.setName(name)
的代码,并且很难弄清楚发生了什么。

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


2
投票

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


2
投票

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

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

  • 南河三
  • CFR
  • 京东
  • 蕨花

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


0
投票

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

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

如果反编译一个类,发现代码过于复杂,变量名、方法名都是a、b、c……,说明该项目被混淆了。


0
投票

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

javap -c org.example.MyClass

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

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


0
投票

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

java
代码。

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

What about the correctness of the code extracted from this option?

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


0
投票

我使用过intellij idea社区版,我注意到我也可以打开.class文件,并且反编译的代码与我编码的代码完全相同。

虽然我不确定这是否是由于在打开它的同一个IDE中编译到.class文件所致。

结果的准确性也可能因其他用例而异。

© www.soinside.com 2019 - 2024. All rights reserved.