如何以人类可读的方式打开Java .class文件?
我试图弄清楚Java applet的类文件在做什么。用记事本或者文本板打开它只会显示一堆乱码。
有什么方法可以将其纠缠成某种可读性的格式,以便我可以尝试弄清楚它在做什么吗?
- 环境==安装了带VS 2008的Windows。
解决方案
回答
使用Jad进行反编译可能是最佳选择。除非对代码进行混淆,否则将产生好的结果。
回答
那是已编译的代码,我们需要使用反编译器(例如JAD):http://www.kpdus.com/jad.html
回答
如果要使用Java反编译器,可以使用命令行工具javap
来完成。另外,Java Decompiler HOW-TO描述了如何反编译类文件。
回答
我们正在寻找的是Java反编译器。我建议使用JAD http://www.kpdus.com/jad.html,它可免费用于非商业用途,并且可以完成工作。
注意:这不会使代码与编写的代码完全相同。也就是说,我们将丢失注释和可能的变量名,因此,这比阅读普通的源代码要困难一些。如果开发人员确实是秘密的,他们也会混淆自己的代码,从而使其更难阅读。
回答
如建议的那样,我们可以使用JAD对其进行反编译并查看文件。为了使阅读更容易,我们可以使用eclipse的JADclipse插件将JAD直接集成到eclipse或者使用DJ Java Decompiler,它比命令行JAD易于使用
回答
如果我们不介意读取字节码,则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
回答
如果我们想要可读的Java代码,那么JAD是一个很好的选择。但是,如果我们确实想深入研究.class文件格式的内部结构,则需要使用javap。它与JDK捆绑在一起,使我们可以将十六进制字节码"反编译"为可读的ASCII。它产生的语言仍然是字节码(不是Java那样的东西),但是它相当易读且极富启发性。
同样,如果我们确实愿意,可以在十六进制编辑器中打开任何.class
文件,然后直接读取字节码。结果与使用javap
相同。
回答
jd-gui是目前最好的反编译器。与日渐流行的JAD相比,它可以处理Java中的新功能。
回答
我们需要使用反编译器。其他人建议使用JAD,还有其他选择,JAD是最好的。
我会回应一些评论,与原始源代码相比,我们可能会有所损失。如果代码由于擦除而使用了泛型,那就显得特别有趣。
回答
当然,可以使用JAD和/或者JADclipse Eclipse插件。
回答
无需反编译Applet.class。 JDK附带了公共Java API类源代码(如果我们选择安装它),并且比反编译的字节码可读性更好。我们可以在src.zip(位于JDK安装文件夹中)中找到压缩文件。
回答
如果要查看的类文件是开源的,则不应对其进行反编译,而应将源文件直接添加到IDE中。这样,我们就可以查看某些库类的代码,就好像它是我们自己的一样
回答
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尚不是最好的反编译器...但是我正在努力:)