使用JAD反编译java文件



近来命途多舛,不慎将单位电脑的系统搞挂掉了,还原系统也失败,最要命的是同事在还原的时候把我机器里的其他文件也冲掉了 流泪 。唉,虽然工作相关的代码都提交到了svn上,但是还有许多实验性质的宝贵代码都蒸发了啊。

今日遇一难题,需要升级一个Application,但是除了服务器上正在运行的这个Application的jar之外,我已经没有任何与之相关的代码了……难道我再重写一个?岂不说要浪费多少精力和时间,万一出了点差错,那可不是闹着玩的。

猛然想到,以前在网上看到过一篇文章介绍可以反编译java的.class文件的工具JAD。 不过据说已经很久没有升级了。抱着试试看的想法,去JAD的网站下了一个来用。上去下了一个Jad 1.5.8e for Linux on Intel platform,这个也是2001年的东东了,呵呵。不知道老兄能不能胜任啊。

解压之后,得到了一个jad文件和一个ReadMe.txt。文档就不读了,高级的参数暂时用不到,以后再研究吧。

运行:

#jad xxx.class

=====================================下面附一些转来的内容==================================

jad  -ff -nl   -space -8 -nonlb -s .java .class


jad是非常出色的免费java字节码反编译器,相信不少人都使用过。我坚信“一段可以工作的代码就是最好的参考文档”,因此使用jad使我从前人的工作中获益匪浅:)



jad是一个基于命令行的程序,提供了大量的命令行选项,可能很多人还不熟悉,我就介绍几个对大家有帮助的。

-8:    把Unicode编码的字符转换成ASCII输出,这样程序中的中文就会原样输出,而不是令人费解的uxxxx这种形式

-nl:    把字符串按照

切分输出,这样很长的字符串也不至于都放在一行,增强了可读性。

JAVA手机网[www.cnjm.net]

-ff:    把数据成员放在方法之前,这样就符合大家写程序的习惯了

-space:    在if, while等关键字和表达式之间加入空格,这是java的良好编程风格

-nonlb:    不在开大括号(也就是左大括号)前加回车,这是大部分java程序员的习惯风格,大家可以根据自己的习惯选用

经过这样的配置,jad输出的java代码几乎跟手写的没有什么两样(当然格式要比手写的还要规范)

为了更加方便(因为我very very lazy~~),我还编写了一个批处理文件,把它和.class建立关联,这样我只要用鼠标双击任意一个.class文件,对应的java代码直接就在我的UltraEdit里打开,我现在几乎忘了java和class文件的区别了:-D。请把附件里的jad.exe和jadplus.bat同时放到PATH中的一个目录下,我一般就放到C:WINNT下面,如果是WinXP则是C:Windows。

==========================================================

jadplus.bat:

@if not exist %~n1.java jad -p -ff -nl -space -8 -nonlb %1 > %~n1.java

@uedit32 %~n1.java

==========================================================


注:

1 -p的意思是直接输出到屏幕,这样方便我重定向输出到一个java文件。

2 jad前面加了个判断,如果对应的java文件不存在才进行反编译,避免覆盖掉原来的java代码。

3 如果你习惯用别的java编辑器,那么修改第二行把uedit32改成你习惯的java编辑器即可。



批量反编译

但是只能对JDK1.4.2和之前的版本编译的程序反编译,而JDK5.0后的就无能为力了,但是可以下载JAD.EXE来逐个反编译CLASS文件,不过如果碰到有几十个或几百个文件夹,并且目录很深的时候,就麻烦了,这个给出一个直接使用命令行反编译整个目录的方法:使用jad批量反编译

jad -o -r -sjava -d src bin/**/.class

src: 是反組後的目錄

bin:指 package 開頭

将bin里面所有的.class反编译到src下面  

便可完成反编译工作。

得到的是xxx.jad的文件。直接打开,oh thand goodness!!100%把我的代码还原了。哈哈,这下子省事咯(不过还要没有用混淆……)


加载评论框需要翻墙