【问题标题】:How can I open Java .class files in a human-readable way?如何以人类可读的方式打开 Java .class 文件?
【发布时间】:2008-09-16 20:01:49
【问题描述】:

我试图弄清楚 Java 小程序的类文件在幕后做了什么。用记事本或文本板打开它只会显示一堆 gobbledy-gook。

有什么方法可以将它重新转换为可读的格式,以便我可以尝试弄清楚它在做什么?

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

【问题讨论】:

  • 只是语义上的东西,不应该是一=不是二吗? == 是一个问题,而 = 是一个陈述,您正在对您的环境进行陈述。
  • 你能澄清一下这个问题吗?我的直接想法是您想读取实际的字节码,但似乎您实际上想反编译别人的代码。
  • @icco,= 表示赋值,== 表示相等。他说 (Environment == Windows w/VS2008 installed) 是真的,没有下令将 Environment 设置为安装了 VS2008 的 Windows。离题又书呆子的人。
  • 备案 == 不声明相等;它测试平等。你可以写 true == false,它和写 Environment == Windows w/VS 2008 一样有意义,即根本没有意义。

标签: java windows class applet


【解决方案1】:

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

【讨论】:

  • 这个答案在 2020 年的最新情况如何?
  • 只要链接到某个地方,我想它就很好。我不知道现在是否有更好的 Java 反编译器,因为我很久以前就没有使用过 Java。
【解决方案2】:

如果您不介意阅读字节码,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

【讨论】:

    【解决方案3】:

    正如@MichaelMyers 指出的,使用

    javap -c <name of java class file> 
    

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

    javap -c <name of java class file> > decompiled.txt
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          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.

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  【解决方案10】:

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

                  【讨论】:

                    【解决方案11】:

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

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

                    【讨论】:

                      【解决方案12】:

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

                      【讨论】:

                        【解决方案13】:

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

                        【讨论】:

                          【解决方案14】:

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

                          【讨论】:

                            【解决方案15】:

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

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

                            【讨论】:

                              【解决方案16】:

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

                              【讨论】:

                                【解决方案17】:

                                CFR - another java decompiler 是使用 Java 6 编写的现代 Java 的出色反编译器。

                                【讨论】:

                                  猜你喜欢
                                  • 1970-01-01
                                  • 2015-06-06
                                  • 1970-01-01
                                  • 2012-03-19
                                  • 2010-12-10
                                  • 2020-02-13
                                  • 1970-01-01
                                  • 2013-11-07
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多