我想弄清楚一个Java小程序的类文件正在做什么。用记事本或文本板打开它只显示一堆gobbledy-gook。如何以人类可读的方式打开Java .class文件?
有没有什么办法可以把它变回可读格式,这样我就可以试着弄清楚它在做什么?
- 环境== Windows w/VS 2008安装。
我想弄清楚一个Java小程序的类文件正在做什么。用记事本或文本板打开它只显示一堆gobbledy-gook。如何以人类可读的方式打开Java .class文件?
有没有什么办法可以把它变回可读格式,这样我就可以试着弄清楚它在做什么?
jd-gui是目前最好的反编译器。它可以处理Java中较新的功能,而不是像尘土飞扬的JAD。
使用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
相同。
您需要使用反编译器。其他人建议JAD,还有其他选择,JAD是最好的。
我会回应评论说,与原始源代码相比,您可能会失去一点点。如果代码使用泛型,由于擦除,它会显得特别有趣。
肯定是JAD和/或JADclipse Eclipse插件。
没有必要反编译Applet.class。公共Java API类源代码随JDK一起提供(如果您选择安装它),并且比反编译的字节码更易读。您可以在src.zip中找到压缩文件(位于您的JDK安装文件夹中)。
如果您想查看的类文件是开源的,您不应该对其进行反编译,而是直接将源文件附加到IDE中。这样,你可以直接查看一些库类的代码,就好像它是你自己的一样
cpuguru,如果你的applet已经用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是不是最好的反编译但......但我在努力:)
JD-GUI“http://code.google.com/p/innlab/downloads/detail?name=jd-gui-0.3.3.windows.zip&can=2&q=”是反编译的.class文件最好的和用户友好的选项....
CFR - another java decompiler是写我的Java 6
现代Java的一个伟大的反编译正如@MichaelMyers指出,使用
javap -c <name of java class file>
获得JVM汇编代码。您也可以将输出重定向到文本文件以获得更好的可见性。
javap -c <name of java class file> > decompiled.txt
你也可以使用在线的java反编译器。对于例如http://www.javadecompilers.com
只是一个语义学的东西,不应该是一个=不是两个? ==是一个问题,而=是一个陈述,你正在对你的环境做出陈述。 – icco 2008-09-16 20:08:13
你能澄清这个问题吗?我的直接想法是,你想读取实际的字节码,但似乎你真的想反编译别人的代码。 – 2008-09-16 20:39:59
@icco,=表示赋值,==表示相等。他在说(安装了VS2008的Environment == Windows)是正确的,并没有给出将环境设置为安装有VS2008的Windows的命令。 那个偏离主题和书呆子的人。 – Blorgbeard 2008-09-16 20:47:18