如何以人类可读的方式打开Java .class文件?


111

我试图弄清楚Java applet的类文件在做什么。用记事本或文本板打开它只会显示一堆乱码。

有什么方法可以将其纠缠成某种可读性的格式,以便我尝试找出它在做什么?

  • 环境==已安装Windows VS 2008。

7
只是语义上的事情,难道不是一个=不等于两个吗?==是一个问题,而=是声明,您正在声明有关您的环境的信息。
icco

你能澄清这个问题吗?我立即想到的是,您想读取实际的字节码,但似乎您实际上想反编译其他人的代码。
Outlaw程序员

12
@ icco,=表示分配,==表示相等。他说的是(Environment == Windows w / VS2008已安装)是正确的,没有下达命令将Environment设置为Windows w / VS2008。讨厌和讨厌的人。
Blorgbeard在

7
记录==不声明相等;它测试平等。您可以编写true == false,这和编写环境== Windows w / VS 2008一样有意义,即完全没有意义。
bwerks

Answers:


208

jd-gui是目前最好的反编译器。与日渐流行的JAD相比,它可以处理Java中的新功能。


这个答案在2020年之前如何?
,编码袋熊

只要链接到某处,我想它就很好。我不知道现在是否有更好的Java反编译器,因为我很久以前就没有使用过Java。
DarenW

77

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

9

正如@MichaelMyers指出的那样,请使用

javap -c <name of java class file> 

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

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


2

您正在寻找的是Java反编译器。我建议使用JAD http://www.kpdus.com/jad.html, 它可免费用于非商业用途,并且可以完成工作。

注意:这不会使代码与编写的代码完全相同。也就是说,您将丢失注释和可能的变量名,因此,与仅阅读常规源代码相比,这将更加困难。如果开发人员确实是秘密的,他们也会混淆自己的代码,从而使其更难阅读。


2

cpuguru,如果您的applet已使用javac 1.3(或更低版本)编译,则最佳选择是使用Jad。

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

如果您的applet已使用较新的编译器进行编译,则可以尝试JD-GUI:该反编译器正在开发中,但是,大多数情况下,它会为使用JDK 1.4、1.5或1.6编译的类生成正确的Java源代码。

DarenW,谢谢你的帖子。JD-GUI尚不是最好的反编译器...但是我正在研究:)





1

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

我会回应一些评论,与原始源代码相比,您可能会有所损失。如果代码由于擦除而使用了泛型,那就显得特别有趣。



1

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


0

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


0

如果您想要可读的Java代码,那么JAD是一个很好的选择。但是,如果您真的想深入研究.class文件格式的内部结构,就需要javap。它与JDK捆绑在一起,使您可以将十六进制字节码“反编译”为可读的ASCII。它产生的语言仍然是字节码(不是J​​ava之类的东西),但是它相当易读且极富启发性。

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


0

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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.