Java 代碼編譯后生成的 .class 中包含有源代碼中的所有信息(不包括注釋),尤其是在其中保存有調試信息的時候。所以一個按照正常方式編譯的 Java .class 文件可以非常輕易地被反編譯。通常情況下,反編譯可以利用現有的工具jd-gui.exe或者jad.exe。
(這兩個反編譯工具在我的資源里有下載:
jd-gui.exe: http://download.csdn.net/detail/dianacody/7760019;
jad.exe: http://download.csdn.net/detail/dianacody/7760093)
有些情況下,為了保護java源碼不被別人看到,通常會使用加密手段對java源碼進行加密,加密的方式可以利用加密工具(比如java代碼混淆工具)、使用加密算法(如DES算法)修改classloader對編譯好的.class文件進行加密。
(注:這里推薦一款java代碼混淆器,可以混淆函數變量、類、方法名以實現代碼加密:proGuard: http://download.csdn.net/detail/dianacody/7760089)
一、用java混淆器工具proGuard實現加密
這里使用proGuard對jar包進行加密。
1. 解壓下載的proguard,解壓后進入lib文件把proguard.jar拷貝到自己新建的文件夾里如圖:

2. 把需要混淆的jar和jar所依賴的包也放到新建的文件夾,都放在一起,如下圖。
3. 寫一個配置文件,名稱自己定,例如”a”文件,舉個簡單配置文件例子(那個proguard.map是過后自己生成的),內容如下,其中-injars:是你需要混淆的jar,-outjars:是你混淆后輸出的jar,-libraryjars:是你混淆的jar需要所依賴的jar包,后面的不在一一說明,可以參考proguard文檔,配置文件可以參考文檔來對自己混淆的需求來寫配置文件。
-injars TheFirstDesktopApplication1.jar
-outjars TheFirstDesktopApplication1_out.jar
-libraryjars <java.home>/lib/rt.jar
-libraryjars appframework-1.0.3.jar
-libraryjarsswing-worker-1.1.jar
-printmappingproguard.map
-overloadaggressively
-defaultpackage ''
-allowaccessmodification
-dontoptimize
-keep public class*
{
public protected *;
}
-keep public classorg.**
-keep public classit.**
4. 把配置文件保存到你建的文件夾下,如下圖。

5.點擊開始,運行,輸入cmd,進入你建的文件夾下,如下圖。
6. 然后輸入命令語句:java -jarproguard.Jar @a 然后回車,如下圖。
7. 混淆成功,在產生TheFirstDesktopApplication1_out.jar如下圖。
8. 混淆器后,利用反編譯器jad對沒TheFirstDesktopApplication1_out.jar反編譯,多了好多a,b,c之類的類文件,對反編譯的java文件是很難編譯的,即說明混淆成功。
用上面方法試了一下,發現其實混淆效果並不好,使用jd-gui反編譯工具就可以輕易看到源碼。總結一下,網上找了幾個代碼混淆工具效果都不好,其實現成工具看來也並不是那么好用。
然后想想,就換了一種方式,直接使用加密算法對java代碼進行解密。在下篇文章里再寫。