JVM之字節碼——分析class文件(一)_kenvifire-ChinaUnix博客

二、手動分析class文件 上面大致講解了一下class文件的結構,這裏,我們拿一個class文件做一個簡單的分析,來驗證上面的說法。
先看看一個簡單的類

點擊(此處)摺疊或打開

    public class Hello{
    private int test;
    public int test(){
    return test;
    }
    }
編譯之後的class文件十六進制結果如下所示,可以用UE等十六進制編輯器打開:

點擊(此處)摺疊或打開

    ca fe ba be 00 00 00 32 00 12 0a 00 04 00 0e 09 00 03 00 0f 07 00 10 07 00 11 01 00 04 74 65 73 74 01 00 01 49 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29 56 01 00 04 43 6f 64 65 01 00 0f 4c 69 6e 65 4e 75 6d 62 65 72 54 61 62 6c 65 01 00 03 28 29 49 01 00 0a 53 6f 75 72 63 65 46 69 6c 65 01 00 0a 48 65 6c 6c 6f 2e 6a 61 76 61 0c 00 07 00 08 0c 00 05 00 06 01 00 05 48 65 6c 6c 6f 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 00 21 00 03 00 04 00 00 00 01 00 02 00 05 00 06 00 00 00 02 00 01 00 07 00 08 00 01 00 09 00 00 00 1d 00 01 00 01 00 00 00 05 2a b7 00 01 b1 00 00 00 01 00 0a 00 00 00 06 00 01 00 00 00 01 00 01 00 05 00 0b 00 01 00 09 00 00 00 1d 00 01 00 01 00 00 00 05 2a b4 00 02 ac 00 00 00 01 00 0a 00 00 00 06 00 01 00 00 00 03 00 01 00 0c 00 00 00 02 00 0d

接下來我們就按照class文件的格式來分析上面的一串數字,還是按照之前的順序來
1、魔數:cafebabe,這個是用來標識java class文件的,如果文件的開始不是cafebase的話,虛擬機會拒絕加載該文件。關於這個我們可以試驗一下,用16進制編輯器修改cafebabe。運行 java Hello會拋出ClassFormatErrorException in thread "main" java.lang.ClassFormatError: Incompatible magic value
2868820670 in class file Hello

2、接下來就是version字段:00 00 00 32,前兩個字節00是minor_version,後兩個字節0032是major_version字段,對應的十進制值爲50,也就是說當前class文件的主版本號爲50,次版本號爲0。前面講過,如果version字段不在當前虛擬機支持的範圍之內,虛擬機會拒絕加載。我們可以試一下,把version字段改大,例如改成00 01 00 40(主版本號爲64,次版本號爲1)。加載該class文件,會拋出java.lang.UnsupportedClassVersionError: Hello : Unsupported major.minor version 64.1,表示當前虛擬機不支持64.1版本的class文件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章