我看Java虛擬機(3)---類文件結構

存儲兩種數據:無符號數和表。
魔數:4字節,識別文件,後綴是會被改變的,所以識別class文件是靠這四個字節。
版本號:2字節次版本號+2字節主版本號
常量池:2字節常量池中存放數據的個數len+len個常量順序放置;11種數據類型1-12表示,標號2缺省(具體我也不知道爲什麼)
這裏寫圖片描述
訪問標誌:2字節
類索引,父類索引,接口索引集合:2字節+2字節+若干字節,都索引向常量池的數據
字段數量:2字節
字段表:2字節(訪問標誌)+2字節(名稱)+2字節(描述符)+若干(不重要)。用於描述接口或類中聲明的變量。包括類變量(static修飾)和實例變量,不包括方法內部聲明的變量(局部變量)。
全限定名:類似“org/example/clazz/TestClass”。
簡單名稱:沒有類型和參數修飾的方法或字段名稱。int inc(int a ,int b)和int m分別爲inc和m。
描述符:(參數)+返回值。int index(char[] cs , int i )描述符爲”([CI)I”
方法數量:2字節
方法表集合:類比字段表。訪問標誌增加,比如synchronized,abstract等。
屬性表集合:主要code,存儲方法指令字節碼+其他屬性。示例:

public int inc(){
    int x;
    try{
        x = 1;
        return x;
    }catch(Exception e){
        x = 2;
        return x;
    }finally{
        x = 3;
    }
}

正常和異常返回值各式什麼?答案:1,2;
以正常執行爲例,虛擬機會這樣執行,在操作數棧中給x賦值1,將該值的一個副本放到局部變量表中,finally修改操作數棧的x,但並不會影響局部變量的x值,當要執行返回指令時,操作數棧讀入局部變量的1到棧頂,返回1。異常情況類同。

爲什麼字段表和方法表前面都有2字節的表述數量的字段,而類前面沒有?
答:因爲一個class文件只有一個類,而字段和方法數量不確定。
後面章節將會根據圖:

這裏寫圖片描述

一步一步分析講解,前面算靜態的,後面就是動態講解了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章