Java程式員很少注意程式的編譯結果。事實上,Java的位元組代碼向我們提供了 非常有價值的資訊。特別是在調試排除Java效能問題時,編譯結果讓我們可以更 深入地理解如何提高程式執行的效率等問題。其實JDK使我們研究Java位元組代碼變 得非常容易。本文闡述怎樣利用JDK中的工具查看解釋Java位元組代碼,主要包含以 下方面的一些內容:
l Java類分解器——javap
l Java位元組代碼是怎樣使程式 避免程式的記憶體錯誤
l 怎樣通過分析位元組代碼來提高程式的執行效率
l 利用第三方工具反編譯Java位元組代碼
一、Java類分解器 ——javap
大多數Java程式員知道他們的程式不是編譯成本機 代碼的。實際上,程式被編譯成中間位元組代碼,由Java虛擬機器來解釋執行。然而 ,很少程式員注意一下位元組代碼,因為他們使用的工具不鼓勵他們這樣做。大多 數的Java調試工具不允許單步的位元組代碼調試。這些工具要麼顯示原始碼,要麼 什麼都不顯示。
幸好JDK提供了Java類分解器javap,一個命令列工具。 javap對類名給定的檔案(.class)提供的位元組代碼進行反編譯,列印出這些類的 一個可讀版本。在預設情況下,javap列印出給定類內的公用域、方法、建構函式 ,以及靜態初始值。
1.javap的具體用法
文法: javap <選項 > <類名>...
其中選項包括:
| 參數 |
含義 |
| b |
向後相容JDK 1.1中的 javap |
| c |
反編譯代碼,列印出每個給定類中方法的 Java虛擬機器指令。使用該選項後,將對包括私人及受保護方法在內的所有方法進 行反編譯 |
| classpath <pathlist> |
指明到哪裡 尋找使用者的類檔案。這個選項值覆蓋了缺少路徑以及由CLASSPATH環境變數定義的 路徑。此處給出的路徑是一個目錄及zip檔案有序列表,其元素在Unix中以 “:”,在Windows中以“;”分隔。要想在不覆蓋預設系統 類路徑的情況下增加一些要尋找的目錄或zip檔案,應使用CLASSPATH環境變數, 使用方法與編譯器的-classpath相同。 |
| extdirs <dirs> |
覆蓋安裝擴充目錄 |
| help |
顯示協助資訊 |
| J<flag> |
將<flag>直接傳遞給運行系 統 |
| l |
在原來列印資訊的基礎上,增加行號和局部 變數表 |
| public |
只顯示公用類及其成員 |
| protected |
顯示受保護/公用類及其成員 |
| package |
顯示包受保護/公用類及其成員(預設) |
| private |
顯示所有類及其成員 |
| s |
列印內部類型標記 |
| bootclasspath <pathlist> |
覆蓋由引導類加 載器載入的類檔案位置 |
| verbose |
列印堆棧大小,方 法的局部變數和參數的數目。若可驗證,列印出錯原因 |