如何“反编译”Java类文件?

556

我应该使用什么程序来反编译一个class文件?我会得到Java代码,还是只有JVM汇编代码?

在这个网站上关于Java性能问题的回答中,我经常看到人们从"class"文件中"反编译"出来以查看编译器如何优化某些内容。


4
“反编译”艺术也可以被视为逆向工程。但有时在逆向某些内容时,您并不总是能够获得二进制文件。 - Makach
没有人提到 https://bytecodeviewer.com/,它可以反编译为Java源代码和字节码(对于Java源代码是基于JAD的)。 - Fernando Gonzalez Sanchez
19个回答

9

大多数针对Java的反编译器都基于JAD。这是一个很好的工具,但不幸的是它已经有一段时间没有更新了,并且不能很好地处理Java 1.5+类。我还没有看到任何可以正确处理1.5+类的工具。


3
给你,我刚刚回复了你的答案 ;) 支持JDK1.5及以上版本! - VonC
我还没有看到任何能够正确处理1.5+类的工具 - Procion,Fernflower,JDCore和CFR(这个可以处理Java 8!) - Andrew Rukin

6

3
那也使用了底层的jad - Quinn Taylor

6

迄今为止列出的所有JAD链接似乎都失效了,所以我找到了这个网站。对于Linux来说很好用!在Ubuntu 11.10上,由于某种原因,我不得不下载静态版本。

http://www.varaneckas.com/jad


5
如果您想查看Java编译器如何执行某些操作,您不需要反编译,而是需要反汇编。反编译将字节码转换为Java源代码,这意味着许多低级信息都会丢失,如果您想知道编译器优化的情况,这可能是您感兴趣的非常信息。
无论如何,我恰好写了一个开源Java反汇编器。与Javap不同,它甚至可以在高度病态的类上工作,因此您可以看到混淆工具对您的类所做的操作。它也可以进行反编译,但我不建议这样做。

5
  • JAD是一款工作简单的反编译软件。

  • 如果您只想查看方法,可以使用javap。


4
在IntelliJ IDEA平台上,您可以使用Java Decompiler IntelliJ Plugin。它允许您在调试过程中显示所有Java源代码,即使您没有它们。它基于著名的工具JD-GUI

enter image description here


@NoOP,你是机器人吗?还是只是没有注意到评论的主题? - naXa stands with Ukraine
抱歉,乍一看似乎是链接式回答。也许您应该添加更多细节,并且您的回答仅符合问题标题而不符合问题内容。 - ashiquzzaman33
这并没有提供问题的答案。如果您想对作者进行批评或请求澄清,请在他们的帖子下留言。 - Kristijan Iliev
@Chris,你尝试过建议的解决方案吗?你甚至读了问题吗? - naXa stands with Ukraine
1
@NoOP,抱歉我之前有些失礼了 =( 我被那些不注意细节的审阅者数量所压倒。 - naXa stands with Ukraine

4

JAD对我来说不起作用(Ubuntu 11.10问题),所以我已经转向并停留在JODO。至少它有开放的Java源代码,并且能够正确反编译我的.class文件。

我建议先查看'branches/generic'分支。主干不稳定。


1
JODO目前只是偶尔维护,而CFR和Procyon则在积极开发并支持JDK 8。 - Janus Troelsen

1

1

使用AndroChef Java Decompiler,您可以反编译apk、dex、jar和java类文件。它简单易用。AndroChef JD基于FernFlower。您可以在10次免费使用中评估它。

AndroChef支持Java语言特性,如泛型、枚举和注释。根据一些研究,AndroChef Java Decompiler能够反编译由传统Java编译器生成的98.04%的Java应用程序 - 一个非常高的恢复率。这是一个简单但功能强大的工具,可以将Java和Dalvik字节码(DEX,APK)反编译为可读的Java源代码。


1
@Dimitrius,请在审查过程中仔细阅读答案。您如何想象在这里包含FernFlower或AndroChef? - naXa stands with Ukraine

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