如何以易读的方式打开Java .class文件?

142

我试图弄清楚Java小程序的类文件在底层做什么。用记事本或Textpad打开只显示一堆乱码。

有没有办法将它转换为较易读的格式,以便我可以尝试理解它在做什么?

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

8
仅仅是一个语义问题,应该是“one”等于而不是“two”。双等号“==”表示疑问,而单等号“=”表示陈述,你在陈述关于你的环境的信息。 - icco
你能澄清一下这个问题吗?我最初的想法是你想要读取实际的字节码,但似乎你实际上想反编译别人的代码。 - Tim Frey
14
他说的是,(Environment == 安装了VS2008的Windows)是正确的,而不是要求将Environment设置为安装了VS2008的Windows。@icco, =表示赋值,==表示相等。这句话有些离题和专业化。 - Blorgbeard
7
记录一下 == 并不表示相等;它是用来测试是否相等的。你可以写 true == false,但它和写 Environment == Windows w/ VS 2008 installed 一样没有意义,也就是完全没有意义。 - bwerks
17个回答

229

jd-gui目前是最佳的反编译器。相比于日渐老旧的JAD,它能够处理Java中的新特性。


1
这个答案在2020年还有多少更新? - The Coding Wombat
只要链接能够正常访问,我就认为它不错。自从很久以前就没有使用Java了,我也不知道现在是否有更好的Java反编译工具。 - DarenW
@DarenW jd-gui似乎是一个不安全的地方,它实际上可信吗? - MauricioTL

87

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

24

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

javap -c <name of java class file> 

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

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

7

如果你需要一个Java反编译器,你可以使用命令行工具javap来完成。此外,Java Decompiler HOW-TO中详细描述了如何反编译类文件。


3

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


3

2

2

如果您的小程序是使用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目前还不是最好的反编译器,但我正在努力改进它 :)


2
您需要的是一款Java反编译器。我推荐 JAD http://www.kpdus.com/jad.html 这是一个非商业用途免费的工具,能够完成您的需求。
请注意:即使使用反编译器,代码也不可能完全与原始代码相同。例如可能会丢失注释和变量名,因此阅读时可能会比普通源代码更困难。如果开发人员保密性很高,他们还会混淆代码,使其更难以阅读。

1
如果你想查看的类文件是开源的,那么你不应该对其进行反编译,而是直接将源文件附加到你的IDE中。这样,你就可以像查看自己的代码一样查看某个库类的代码了。

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