資源描述:
《【深入java虛擬機(jī)(2)】:class類文件結(jié)構(gòu)-編程開發(fā)技術(shù)》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、【深入Java虛擬機(jī)(2)】:Class類文件結(jié)構(gòu)-編程開發(fā)技術(shù)【深入Java虛擬機(jī)(2)]:Class類文件結(jié)構(gòu)原文岀處:蘭亭風(fēng)雨平臺無關(guān)性Java是與平臺無關(guān)的語言,這得益于Java源代碼編譯后生成的存儲字節(jié)碼的文件,即Class文件,以及Java虛擬機(jī)的實現(xiàn)。不僅使用Java編譯器可以把Java代碼編譯成存儲字節(jié)碼的Class文件,使用JRuby等其他語言的編譯器也可以把程序代碼編譯成Class文件,虛擬機(jī)并不關(guān)心Class的來源是什么語言,只要它符合一定的結(jié)構(gòu),就可以在Java中運(yùn)行。Java語言中的各種變量、關(guān)鍵字和運(yùn)算符的語義最終都是市多條字節(jié)碼命令組合
2、而成的,兇此字節(jié)碼命令所能提供的語義描述能力肯定會比Java語言本身更強(qiáng)大,這便為其他語言實現(xiàn)一些有別于Java的語言特性提供了基礎(chǔ),而且這也正是在類加載時耍進(jìn)行安全驗證的原因。類文件結(jié)構(gòu)???Class文件是一組以8位字節(jié)為基礎(chǔ)單位的二進(jìn)制流,各個數(shù)據(jù)項口嚴(yán)格按照順序緊湊地排列在Class文件中,中間沒冇添加任何分隔符,這使得整個Class文件中存儲的內(nèi)容幾乎全部都是程序運(yùn)行的必要數(shù)據(jù)。根據(jù)Java虛擬機(jī)規(guī)范的規(guī)定,Class文件格式釆用一種類似于C語言結(jié)構(gòu)體的偽結(jié)構(gòu)來存儲,這種偽結(jié)構(gòu)中只有兩種數(shù)據(jù)類型:無符號數(shù)和表。無符號數(shù)屬于基本數(shù)據(jù)類型,以ul、u2、nd.
3、迪來分別代表1、2、4、8個字節(jié)的無符號數(shù)。表是由多個無符號數(shù)或其他表作為數(shù)據(jù)項構(gòu)成的符合數(shù)據(jù)類型,所冇的表都習(xí)慣性地以結(jié)尾。???整個Class文件本質(zhì)上就是一張表,它由如下所示的數(shù)據(jù)項構(gòu)成。???從表屮可以看出,無論是無符號數(shù)述是表,當(dāng)需耍描述同一類型但數(shù)量不定的多個數(shù)據(jù)時,經(jīng)常會使用一個前置的容量計數(shù)器加若干個連續(xù)的該數(shù)據(jù)項的形式,稱這一系列連續(xù)的摸一個類型的數(shù)據(jù)為某一類型的集合,比如,fields_count個fieldjnfo表數(shù)據(jù)構(gòu)成了字段表集合。這里需要說明的是:Class文件中的數(shù)據(jù)項,都是嚴(yán)格按照上表中的順序和數(shù)量被嚴(yán)格限定的,每個字節(jié)代表的含義,
4、長度,先后順序等都不允許改變。???下表列tBTClass文件中各個數(shù)據(jù)項的具體含義:類型名稱數(shù)量U4magic1U2minor_version1U2major_version1U2constant_pool_count1cp_infoconstant_poolconstant_pool_countU2access_flags1U2this_dass1U2superclass1U2interfaces_count1U2interfacesinterfaces_countU2fields_count1fieldinfofieldsfields_countU2metho
5、ds_count1method_infomethodsmethods_countU2atrtributes_count1attribute」nfoatrtributesatrtributes_count??從表中可以看出,無論是無符號數(shù)還是表,當(dāng)需要描述同一類型但數(shù)量不定的多個數(shù)據(jù)時,經(jīng)常會在其前面使用一個前置的容量計數(shù)器來記錄其數(shù)量,而便跟著若干個連續(xù)的數(shù)據(jù)項,稱這-系列連續(xù)的某-類型的數(shù)據(jù)為某-類型的集合,如:fields_count個field_info表數(shù)據(jù)便組成了方法表集合。這里需要注意的是:Class文件小齊數(shù)據(jù)項是按照上表的順序和數(shù)量被嚴(yán)格限定的,每個
6、字節(jié)代表的含義、長度、先后順序都不允許改變。magic與version每個Class文件的頭4個字節(jié)稱為魔數(shù)(magic),它的唯一作用是判斷該文件是否為一個能被虛擬機(jī)接受的Class文件。它的值固定為OxCAFEBABEo緊接著magic的4個字節(jié)存儲的是Class文件的次版本號和主版本號,高版本的JDK能向下兼容低版本的Class文件,但不能運(yùn)行更高版本的Class文件。conspoolmajor_version之后是常量池(constant_pool)的入口,它是Class文件中與其他項目關(guān)聯(lián)最多的數(shù)據(jù)類型,也是占用Class文件空間最大的數(shù)據(jù)項目乙一。常量池
7、屮主要存放兩大類常量:字而量和符號引用。字而量比較接近于Java層面的常量概念,如文本字符串、被聲明為final的常量值等。而符號引用總結(jié)起來則包括了下面三類常量:?類和接口的全限定名(即帶有包名的Class名,如:org.lxh.test.TestClass)?字段的名稱和描述符(private>static等描述符)?方法的名稱和描述符(private、static等描述符)虛擬機(jī)在加載Class文件時才會進(jìn)行動態(tài)連接,也就是說,Class文件屮不會保存各個方法和字段的最終內(nèi)存布局信息,因此,這些字段和方法的符號引用不經(jīng)過轉(zhuǎn)換是無法直接被虛擬機(jī)使用的。當(dāng)虛擬