Java是开源的,是免费的,咱们强烈鄙视全部不公开源代码的东东。好比,对class文件进行加密混淆的类文件,通常状况下,咱们是看不到其源代码的。本文将对此进行详细阐述,说明如何为所欲为的反编译看源码,体验一下其中的乐趣。(本文最后面有相关资源下载)
目前在Java开发工具中,Eclipse可谓是占据着绝对的优点,在日常使用中,你们都会有意无心的查看一下所调用JAR包的源代码,这时若是没有引入源文件的话,将会看不到结果。大象以dom4j-1.6.1.jar为例来进行说明,打开demo项目(请在dom4j分类中查找),找到com.demo.database.DataBaseConnect类,按住Ctrl键,再用鼠标点击Element,如图:
dom4j是开源的,能够在sourceforge.net下载到它的完整版,里面固然包含源代码。大象想说的是,在作开发的时候,须要用到大量的JAR包,你不可能每一个都去down一个源码下来,并且咱们用不到这么多的源码,只是在须要的时候,看下其中的代码,解决一时的问题。
大象经过查看网上其余人的研究成果再结合本身的分析,总结了一些经验,如今整合起来和你们分享一下。
一、安装jadclipse插件
选择插件时,本人曾经使用过网上评论很是好的Jode开发的Eclipse插件,不过效果不是很好,对有些加密的类不能反编译,后来发现不少人用jadclipse,结果试验了一下,很不错的说。
使用jadclipse插件必定要注意Eclipse版本。jadclipse_3.2.4,它对应的是Eclipse3.2版,jadclipse_3.3.0能够用于Eclipse3.3M6以上版。你们千万不要把jadclipse_3.3.0放到Eclipse3.2中,也不要把jadclipse_3.2.4放到Eclipse3.3中,这样作是没什么任何效果滴!大象所有都测试过!
下面来讲下安装过程,其实很简单,网上也有相关的资料。将jadclipse插件(版本本身选择)直接copy到Eclipse目录中的plugins文件夹下,而后打开Eclipse,选择"窗口"-"首选项"-"常规"-"编辑器"-"文件关联",点击文件关联中的*.class,下面就会看到"JadClipse Class File Viewer",选中它,点击缺省值,点击OK,将它设置为默认的类查看器。如图:
另外在用jadclipse的时候,必定要加入jad.exe这个程序,若是只有插件而没有jad,那么仍是不能反编译成功,会显示以下所示的错误,所以咱们还要安装jad。
二、安装jad
能够在 http://www.kpdus.com/jad.html#download 这个地址下载到最新的jad,并且有不一样平台的版本,本文后面也有相关下载。将下载的压缩包解压后复制jad.exe至你的%JAVA_HOME%\bin目录下,这样作的好处是使用方便。而后在Eclipse中设置一下,选择”窗口”-“首选项”-“Java”-“JadClipse”,在path to decompiler中输入jad.exe的绝对路径。这样作是为了保证反编译的效果。大象作过测试,只要将jad.exe放入%JAVA_HOME%\bin目录下,就没问题了,这个地方不设置也不要紧,不过本人仍是建议你们设置一下,其它地方不用管。其实大象也不知道该怎么弄,就让它保持默认值好了。^_^
到这里,咱们的工做就作完了,如今再来按住Ctrl,用鼠标点击Element,怎么样?看到源代码了吗?贴上部分反编译代码,如图:
使用jad对绝大部分的加密混淆class文件都能很好的作到反编译,目前大象还没遇到失败的状况,你们也能够多测试一下。jadclipse插件体积很小(只有40几K),和jad完美结合。大象强烈推荐!
如今有人会说了,这样一个一个的看太麻烦了,我须要一次把一个JAR包下的全部class文件反编译成java源文件。这样的想法是可行的,仍是使用jad工具。
三、批量反编译
由于以前咱们已经将jad加入到了%JAVA_HOME%\bin中,只要配置了环境变量,咱们就能够在命令行中方便的使用。在这里,大象仍是以dom4j-1.6.1.jar为例来讲明具体的操做步骤。
解压dom4j-1.6.1.jar和jaxen-1.1-beta-7.jar。为了方便,我将JAR包解压放到F盘根目录,在cmd中,进入到F盘根路径下,输入命令:jad -o -r -s java -d src org/**/*.class
我解释一下这些参数的含义:
-o:覆盖旧文件,并且不用提示确认。
-r:从新加载生成包结构。
-s:定义输出文件的扩展名。jad为默认扩展名,咱们反编译后固然是要.java源文件了。
-d:输出文件的目录。src表示反编译后的全部文件都放在src目录下。
org/**/*.class:org是解压后的文件夹的名字,整个表示org目录下的全部class文件。你也能够写成这样**/*.class,这表示当前目录及其子目录下全部的class文件(包含全部的子目录)。
反编译dom4j-1.6.1.jar必须得有jaxen-1.1-beta-7.jar,由于dom4j里面有对xpath的调用,而这些东西都是引用jaxen里的API,若是不加则会有这样的错误:
到此,关于反编译的内容所有说完了,不过我还想补充一点,有可能JAR包中的class文件不是老外的,而是咱们本身写的,里面可能会有中文的状况,这时,虽然反编译经过了,但里面倒是gb2312形式的unicode编码,所以咱们还得作一个工做,将这些编码转换成中文。
大象使用ant脚原本完成这个工做,内容比较简单,加了注释,应该很好明白,脚本文件名为build.xml,它放在src目录下,和反编译所得的包处在同一层。html
<? xml version="1.0" encoding="GBK" ?> < project name ="decompile" basedir ="." default ="native2ascii" > <!-- 定义输出目录 --> < property name ="build" value ="build" /> <!-- 清除输出目录 --> < target name ="clean" > < delete dir ="${build}" /> </ target > <!-- 建立输出目录 --> < target name ="init" depends ="clean" > < mkdir dir ="${build}" /> </ target > <!-- 编码转换 reverse="true"为反向转换 --> < target name ="native2ascii" depends ="init" > < native2ascii reverse ="true" src ="${basedir}" encoding ="gb2312" dest ="${basedir}/${build}" /> </ target > </ project >
有一个地方须要补充一下,在native2ascii元素中,src和dest这两个属性表示着路径。若是反编译后,src目录下,有多个不一样的文件夹,这时使用ant来转换编码,请先想好要对哪些文件进行反编码;若是按上面的写法,将会把src目录下的全部文件夹中的全部文件进行反编码。假设,如今有com和org两个文件夹(实际上是两个包),我只须要对com中的文件进行反编码,那么能够这样改写:src="${basedir}/com" dest="${basedir}/${build}/com"
其它的都不变。在cmd中进入到src路径下,输入ant,回车。能够看到以下结果:
经过上面这些操做,class文件已经对咱们彻底公开,想怎么看就怎么看,呵呵~~~~写这些,是以为对开发工做可能会有必定的帮助,若是看后可以对你工做或是学习起到哪怕一点点的做用,大象就感到很知足了;若是你早就了解这些,或是认为写得很差,还请不要扔砖头,扔蕃茄,更不要对大象口诛笔伐,人身攻击,就当看了一篇白话文好了。你们若是有什么好的建议或是意见,欢迎提出来一块儿讨论,一块儿学习。
点击下载:dom4j-1.6.1.jar jaxen-1.1-beta-7.jar
点击下载:jadclipse_3.2.4.jar jadclipse_3.3.0.jar
点击下载:jad.exe build.xml java