二、手動分析class文件 上面大致講解了一下class文件的結構,這裏,我們拿一個class文件做一個簡單的分析,來驗證上面的說法。
先看看一個簡單的類
點擊(此處)摺疊或打開
- public class Hello{
private int test;
public int test(){
return test;
}
}
點擊(此處)摺疊或打開
- 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文件。