131

我试图弄清楚 Java 小程序的类文件在后台做什么。用记事本或文本板打开它只会显示一堆狼吞虎咽的东西。

有什么办法可以把它重新转换成某种可读的格式,这样我就可以试着弄清楚它在做什么?

  • 环境 == 安装了 VS 2008 的 Windows。
4

17 回答 17

220

jd-gui是目前最好的反编译器。与尘土飞扬的 JAD 相比,它可以处理 Java 中的新功能。

于 2008-09-16T20:11:27.020 回答
83

如果您不介意阅读字节码,javap 应该可以正常工作。它是标准 JDK 安装的一部分。

Usage: javap <options> <classes>...

where options include:
   -c                        Disassemble the code
   -classpath <pathlist>     Specify where to find user class files
   -extdirs <dirs>           Override location of installed extensions
   -help                     Print this usage message
   -J<flag>                  Pass <flag> directly to the runtime system
   -l                        Print line number and local variable tables
   -public                   Show only public classes and members
   -protected                Show protected/public classes and members
   -package                  Show package/protected/public classes
                             and members (default)
   -private                  Show all classes and members
   -s                        Print internal type signatures
   -bootclasspath <pathlist> Override location of class files loaded
                             by the bootstrap class loader
   -verbose                  Print stack size, number of locals and args for methods
                             If verifying, print reasons for failure
于 2008-09-16T20:08:16.357 回答
16

正如@MichaelMyers 所指出的,使用

javap -c <name of java class file> 

获取 JVM 汇编代码。您还可以将输出重定向到文本文件以获得更好的可见性。

javap -c <name of java class file> > decompiled.txt
于 2018-02-16T15:51:07.263 回答
7

你想要一个java反编译器,你可以使用命令行工具javap来做到这一点。此外,Java Decompiler HOW-TO描述了如何反编译类文件。

于 2008-09-16T20:05:14.040 回答
2

使用Jad反编译它可能是你最好的选择。除非代码被混淆,否则它会产生一个好的结果。

于 2008-09-16T20:03:26.057 回答
2

你正在寻找的是一个java反编译器。我推荐 JAD http://www.kpdus.com/jad.html 它可以免费用于非商业用途,并且可以完成工作。

注意:这不会使代码与编写的完全相同。即你会丢失注释和可能的变量名,所以它会比仅仅阅读普通的源代码更难一些。如果开发人员真的很神秘,他们也会混淆他们的代码,使其更难阅读。

于 2008-09-16T20:05:58.780 回答
2

cpuguru,如果你的小程序是用 javac 1.3(或更低)编译的,你最好的选择是使用 Jad。

不幸的是,JAD 1.5.8(2001 年 4 月 14 日)支持的最后一个 JDK 是 JDK 1.3。

如果你的小程序是用更新的编译器编译的,你可以试试JD-GUI:这个反编译器正在开发中,不过,它大多数时候会为使用 JDK 1.4、1.5 或 1.6 编译的类生成正确的 Java 源代码。

DarenW,谢谢你的帖子。JD-GUI 还不是最好的反编译器……但我正在努力:)

于 2008-12-23T17:56:50.067 回答
2

jd-gui " http://code.google.com/p/innlab/downloads/detail?name=jd-gui-0.3.3.windows.zip&can=2&q= " 是反编译 .class 的最佳且用户友好的选项文件....

于 2013-09-27T10:05:57.617 回答
2

您还可以使用可用的在线 java 反编译器。例如http://www.javadecompilers.com

于 2018-02-23T11:50:23.187 回答
1

那是编译后的代码,你需要使用像 JAD 这样的反编译器:http ://www.kpdus.com/jad.html

于 2008-09-16T20:03:44.650 回答
1

您需要使用反编译器。其他人建议JAD,还有其他选择,JAD是最好的。

我将回应与原始源代码相比您可能会丢失一点的评论。如果代码使用泛型,由于擦除,它看起来会特别有趣。

于 2008-09-16T20:12:50.683 回答
1

当然,JAD 和/或 JADclipse Eclipse 插件。

于 2008-09-16T20:35:47.617 回答
1

如果您要查看的类文件是开源的,则不应反编译它,而应将源文件直接附加到您的 IDE 中。这样,您就可以查看某个库类的代码,就好像它是您自己的一样

于 2008-09-17T15:29:36.737 回答
0

按照建议,您可以使用 JAD 对其进行反编译并查看文件。为了更容易阅读,您可以使用 eclipse 的 JADclipse 插件将 JAD 直接集成到 eclipse 或使用比命令行 JAD 更容易使用的 DJ Java Decompiler

于 2008-09-16T20:07:55.420 回答
0

如果您希望获得可读的 Java 代码,那么 JAD 是一个很好的选择。如果你真的想深入研究.class文件格式的内部结构,你会想要javap. 它与 JDK 捆绑在一起,允许您将十六进制字节码“反编译”为可读的 ASCII。它产生的语言仍然是字节码(不像 Java),但它具有相当的可读性和极强的指导意义。

此外,如果您真的愿意,您可以在十六进制编辑器中打开任何.class文件并直接读取字节码。结果与使用javap.

于 2008-09-16T20:09:25.853 回答
0

无需反编译 Applet.class。公共 Java API 类源代码随 JDK 一起提供(如果您选择安装它),并且比反编译的字节码更具可读性。您可以在 src.zip 中找到压缩文件(位于 JDK 安装文件夹中)。

于 2008-09-16T20:45:34.597 回答
0

CFR - 另一个 java 反编译器是一个很好的现代 Java 反编译器,它是用 Java 6 编写的。

于 2017-01-18T13:54:18.733 回答