1. 程式人生 > >三種方式檢視Java類位元組碼

三種方式檢視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的右邊就會看到類似下圖的介面,非常豐富的類資訊。

這裡寫圖片描述

以上。