自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

談?wù)凧ava程序的反編譯

開發(fā) 后端
Java是一種簡單的,面向?qū)ο蟮模植际降?,解釋型的,健壯安全的,結(jié)構(gòu)中立的,可移植的,性能優(yōu)異、多線程的動態(tài)語言。本文介紹Java程序的反編譯,供參考。

所謂反編譯就是把編譯后的文件轉(zhuǎn)成源代碼,本來是看不到源碼的,反編譯后就可以看到了。作者因最近分析一些JAVA程序,對JAVA的反編譯進(jìn)行了一番了解,下面將我所了解的情況作以下介紹,希望對JAVA愛好者有所幫助。

JAVA是采用一種稱做“字節(jié)編碼”的程序結(jié)構(gòu),分為小程序(嵌入到HTML文件中)和應(yīng)用程序(直接在命令狀態(tài)下執(zhí)行)兩種類型。無論哪種結(jié)構(gòu),一旦用JAVAC 命令編譯后,均變成后綴為CLASS的同名可執(zhí)行文件。這種文件是不可閱讀的代碼。

經(jīng)查閱了SUN公司的JDK(JDK1.1.3)文檔資料后,我找到了一個據(jù)稱是可反編譯JAVA的JAVAP文件(EXE),這個文件位于\JDK\BIN\ 下面,經(jīng)按說明使用后,感到失望,原來這個“反編譯”僅可反編譯出JAVA程序的數(shù)據(jù)區(qū)(定義)、若干方法和類的引用等。

這里我用了一個簡單例子來說明問題。

JAVA的源程序hello_java.java如下:

 

  1. import java.applet.*;  
  2. import java.awt.*;  
  3. public class hello_java extends Applet  
  4. {  
  5. public void paint(Graphics g)  
  6. {  
  7. g.drawString("Hello Java!\n",20,20);  
  8. }  

 

經(jīng)用反編譯命令:javap -c -package -public -private hello_java hello.java
得到的反編譯結(jié)果(hello.java)如下:(有關(guān)javap命令的選擇參數(shù)請見其使用說明,這里-c表示選擇了反編譯)
 

  1. Compiled from hello_java.java  
  2. public synchronized class hello_java extends java.applet.Applet  
  3. /* ACC_SUPER bit set */ 
  4. {  
  5. public void paint(java.awt.Graphics);  
  6. public hello_java();  
  7. Method void paint(java.awt.Graphics)  
  8. 0 aload_1  
  9. 1 ldc #1 
  10. 3 bipush 20 
  11. 5 bipush 20 
  12. 7 invokevirtual #6 
  13. 10 return 
  14. Method hello_java()  
  15. 0 aload_0  
  16. 1 invokespecial #5 V>  
  17. 4 return 

從上述結(jié)果不難看出該反編譯未能將源程序全譯出來,像語句g.drawString("Hello Java!\n",20,20); 就沒有。隨著程序量增加,未能編譯的JAVA語句還會更多。所以這個反編譯程序僅能起個參考作用。

幸虧有了INTERNET,筆者通過YAHOO很快找到了一個JAVA反編譯“自由軟件”(SHAREWARE),http://www.inter.nl.net/users/H.P.van.Vliet/mocha.htm 。 這個軟件叫MOCHA,據(jù)說是一位30來歲的加拿大的研究生所完成,僅是個“?”版,原因是這位叫做H.P.VAN.VLIET的小伙子患癌逝世了,十分可惜呀!

經(jīng)使用MOCHA反編譯軟件,感到這個軟件十分好用,筆者試反編譯多個JAVA程序,均得到很好的結(jié)果。

這里給出如何使用這個軟件,首先,用WINZIP等將"mocha-b1.zip" 解開得到"mocha.zip"文件,"mocha.zip"不須再解開,這個包內(nèi)包括了反編譯的類文件,只需將其拷貝到JDK所在的目錄下,如:c:\jdk\bin\ 此外,須設(shè)置路徑:SET CLASSPATH=c:\myclasses;c:\jdk\bin\mocha.zip

MOCHA用法:

 

  1. java mocha.Decompiler [-v] [-o] Class1.class Class2.class ... 

 

"java" 調(diào)用Java虛擬機

"mocha.Decompiler" 指示要進(jìn)行JAVA反編譯

"-v" 選擇詳細(xì)輸出

"-o" 選寫入已有的.mocha 文件

"ClassX.class" 指出要反編譯類名

注意,不需給出輸出的JAVA文件名,因為MOCHA自動產(chǎn)生一個與CLASS同名但擴展名為MOCHA的JAVA源文件。

對于上例,可用命令:

 

  1. java mocha.Decompiler [-v] [-o] hello_java.class 

 

得到的源文件:

 

  1. /* Decompiled by Mocha from hello_java.class */ 
  2. /* Originally compiled from hello_java.java */ 
  3. import java.applet.Applet;  
  4. import java.awt.Graphics;  
  5. public synchronized class hello_java extends Applet  
  6. {  
  7. public void paint(Graphics g)  
  8. {  
  9. g.drawString("Hello Java!\n"2020);  
  10. }  
  11. public hello_java()  
  12. {  
  13. }  
  14. }  

 

我們不難發(fā)現(xiàn),此文件與編譯前的JAVA源文件完全一樣!筆者曾經(jīng)用MOCHA反編譯出最大為80K的源文件,均取得成功。

在此,筆者向英年早逝的VLIET表示敬意,感謝他給我們留下這個工具軟件。

【編輯推薦】

  1. Java反編譯之代碼混淆
  2. Java反編譯的幾種常用方法
  3. Eclipse反編譯插件Jadclipse介紹
  4. 防止JAVA字節(jié)碼反編譯問題解決方案

 

責(zé)任編輯:于鐵 來源: 比特網(wǎng)
相關(guān)推薦

2011-05-31 14:18:17

2011-05-31 14:38:04

Android 反編譯

2017-02-20 13:54:14

Java代碼編譯

2021-03-07 16:31:35

Java編譯反編譯

2015-01-15 11:01:43

2009-06-11 13:49:30

2009-06-11 14:11:33

代碼混淆Java反編譯

2018-05-11 10:16:41

微信小程序反編譯

2011-05-31 14:52:13

Android 反編譯 方法

2014-09-25 10:28:02

反編譯工具Java

2012-11-06 10:02:04

JavaJadEclipse

2018-05-11 10:22:05

小程序源碼分析

2021-05-18 10:18:15

Java

2015-01-15 10:15:16

Android反編譯-smail語法

2017-11-27 15:43:49

Androidjadx反編譯

2024-05-22 09:36:42

開源NET

2018-09-05 20:00:23

編程語言Java程序員

2014-08-05 10:51:09

Xcode警告Objective-C

2024-09-09 00:00:07

2021-12-10 10:05:27

Java反編譯jar
點贊
收藏

51CTO技術(shù)棧公眾號