三種方式檢視Java類位元組碼
對於安卓應用,程式中的Java檔案被編譯成.class檔案後,雖然還會被dex工具進行內部優化、壓縮,再打包成dex檔案,但是本質上並未脫開與Java開發類似的編譯和虛擬機器實現,由此,深入安卓開發,離不開深入學習Java語言,也免不了要去研究JVM類載入、JVM位元組碼相關的東西,這時就需要經常檢視位元組碼。
本文提供了三種較為方便的檢視位元組碼的方式。
完全命令列方式
假設本地D盤裡有個Hello.java檔案:
public class Hello
{
public void say(){
Hello he = new Hello();
System.out .println("hello world");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
首先使用命令javac D:\Hello.java,將java檔案編譯成Hello.class檔案,此時直接打不開,可使用jd-gui.exe程式開啟,或者用ide工具(比如as)開啟,不過顯示的Hello.class檔案是被反編譯過的,基本與原java檔案一樣。並不是我們想要看的格式。這時,使用javap -c D:\Hello.class便可以在dos窗口裡看到我們需要的位元組碼檔案:
public class Hello {
public Hello();
Code:
0 : aload_0
1: invokespecial #1
4: return
public void say();
Code:
0: new #2 // class Hello
3: dup
4: invokespecial #3 // Method "<init>":()V
7: astore_1
8: getstatic #4
11: ldc #5 // String hello world
13: invokevirtual #6
16: return
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
外接工具的方式
假設本地D盤裡有個Hello.java檔案,類似上面的描述編譯成Hello.class檔案(或者找到ide中相關out資料夾中的那些.class檔案),然後下載Java Bytecode Editor,解壓,直接執行jbe.sh即可看到UI面板,開啟Hello.class檔案即可看到類似下圖的目錄,將能看到非常豐富的類資訊。
內部外掛工具的方式
上述兩種方式會跳出ide,有時會顯得比較費時。我們需要一款合適的外掛,感謝jclasslib bytecode viewer,我們開啟ide(這裡是Android studio),setting-plugin-browse..-bytecode viewer-jclasslib bytecode viewer-install-restart,此時呢,開啟一個java檔案,對java檔案,然後面板上View-Show bytecode with jclasslib,此時在ide的右邊就會看到類似下圖的介面,非常豐富的類資訊。
以上。