2020-09-27--第六章--類文件結(jié)構(gòu)

1.class類文件結(jié)構(gòu):
Java虛擬機規(guī)范的規(guī)定,Class文件格式采用一種類似于C語言結(jié)構(gòu)體的偽結(jié)構(gòu)來存儲,這種偽結(jié)構(gòu)中只有兩種數(shù)據(jù)類型:無符號數(shù)和表。
class文件的頭4個字節(jié)稱為魔數(shù),它的唯一作用就是確定這個文件時候是一個能被虛擬機接受的class文件。很多圖片格式都用一個魔數(shù)來標(biāo)識文件類型,比如png和jpg等。在java的class文件中,這個數(shù)是0xcafebabe。接下來就是class文件的版本號,第5、6個字節(jié)是次版本號,第7、8個字節(jié)是主版本號。在這里,次版本號是0,主版本號是52,(十六進制是34)。

2.常量池:
常量池中主要存放兩大類常量:字面量和符號引用。字面量比較接近Java語言的常量概念,如文本字符串、聲明為final的常量等。而符號引用則屬于編譯原理方面的概念,它包括三方面的內(nèi)容:
*類和接口的全限定名(Fully Qualified Name);
*字段的名稱和描述符(Descriptor);
*方法的名稱和描述符;

常量池中的每一項常量都是一個表,共有11種結(jié)構(gòu)[插圖]各不相同的表結(jié)構(gòu)數(shù)據(jù),這11種表都有一個共同的特點,就是表開始的第一位是一個u1類型的標(biāo)志位(tag,取值為1至12,缺少標(biāo)志為2的數(shù)據(jù)類型),代表當(dāng)前這個常量屬于哪種常量類型,11種常量類型所代表的具體含義如下

image.png

3.訪問標(biāo)志:
在常量池結(jié)束之后,緊接著的2個字節(jié)代表訪問標(biāo)志(access_flags),這個標(biāo)志用于識別一些類或接口層次的訪問信息,包括:這個Class是類還是接口;是否定義為public類型;是否定義為abstract類型;如果是類的話,是否被聲明為final,等等。具體的標(biāo)志位及標(biāo)志的含義見表6-7。


image.png

4.類索引、父類索引與接口索引集合:
類索引(this_class)和父類索引(super_class)都是一個u2類型的數(shù)據(jù),而接口索引集合(interfaces)是一組u2類型的數(shù)據(jù)的集合,Class文件中由這三項數(shù)據(jù)來確定這個類的繼承關(guān)系。類索引用于確定這個類的全限定名,父類索引用于確定這個類的父類的全限定名。由于Java語言不允許多重繼承,所以父類索引只有一個,除了java.lang. Object之外,所有的Java類都有父類,因此除了java.lang.Object外,所有Java類的父類索引都不為0。接口索引集合就用來描述這個類實現(xiàn)了哪些接口,這些被實現(xiàn)的接口將按implements語句(如果這個類本身是一個接口,則應(yīng)當(dāng)是extends語句)后的接口順序從左到右排列在接口的索引集合中。

5.Code屬性:
最常用的屬性恐怕就是Code屬性了,因為大多數(shù)的方法都會有編譯后的字節(jié)碼指令,這些指令就存儲在方法表中的Code屬性中。如果一個Java程序的信息可以分為代碼(方法體中的代碼)和元數(shù)據(jù)(包括類、字段、方法定義以及其它信息),那么Code屬性存儲的就是代碼,其它所有的結(jié)構(gòu)存儲的都是元數(shù)據(jù)。不過并非所有的方法表都有這個Code屬性,比如接口或抽象類中的方法表就不存在Code屬性(JDK 1.8中的接口也可以定義方法了)。Code屬性的結(jié)構(gòu)如下:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容