Java字節(jié)碼文件結(jié)構(gòu)

《深入理解Java虛擬機(jī)》讀書筆記,java字節(jié)碼文件的這塊定義的數(shù)據(jù)結(jié)構(gòu)比較多击胜,書講解的很詳細(xì)。

一.class文件中的數(shù)據(jù)格式

字節(jié)碼文件是由java源文件經(jīng)過編譯之后獲得掂墓,是以8位字節(jié)為基礎(chǔ)單位的二進(jìn)制流护戳,各個(gè)數(shù)據(jù)嚴(yán)格按照順序緊湊地排列在class文件之中,中間沒有任何分割符绊率,當(dāng)數(shù)據(jù)項(xiàng)占用8位字節(jié)以上的空間時(shí)谨敛,按照高位在前(大端法)的方式分割成若干個(gè)8位字節(jié)進(jìn)行存儲(chǔ)。

class文件中的格式只有倆種數(shù)據(jù)類型:無符號(hào)數(shù)和表

無符號(hào)數(shù):為基本類型的數(shù)據(jù)類型滤否,以u(píng)1,u2,u4,u8來代表1個(gè)字節(jié)脸狸,2個(gè)字節(jié),4個(gè)字節(jié)藐俺,8個(gè)字節(jié)的無符號(hào)數(shù)炊甲。無符號(hào)數(shù)可以用來描述“數(shù)字、索引引用欲芹、數(shù)量值或者按照utf-8編碼構(gòu)成的字符串值卿啡。

:表是由多個(gè)無符號(hào)數(shù)或者其他表作為數(shù)據(jù)項(xiàng)構(gòu)成的復(fù)雜數(shù)據(jù)類型。所有表都習(xí)慣以“_info”結(jié)尾菱父。表用于描述有層次關(guān)系的復(fù)雜結(jié)構(gòu)的數(shù)據(jù)颈娜。如下:

表中描述的標(biāo)簽有“類型、名稱浙宜、數(shù)量”官辽,對于一段由0和1組成的序列來說,有了類型梆奈,那么就知道了數(shù)據(jù)的大小野崇,去讀取數(shù)據(jù)大小的字節(jié)即可,通過名稱可以知道數(shù)據(jù)所要表達(dá)的意思亩钟,數(shù)量則可以知道有多少個(gè)這樣的數(shù)據(jù)類型乓梨。

舉個(gè)例子來說的話,有一段序列是代表一張表清酥,其中表中每一項(xiàng)的類型和數(shù)量是已經(jīng)的扶镀,且是順序排序的。那么在讀取的時(shí)候按照固定的字節(jié)去讀取進(jìn)行解析即可焰轻。

二. class文件格式

整個(gè)class文件也是一張表臭觉。下圖中可以看出編譯之后class文件中包含了常量池、字段表、接口表蝠筑、屬性表等狞膘。

class文件格式

在文件中的存儲(chǔ)如下:

附上自己畫的圖:
三.常量池

常量池中存放倆大類常量:字面量和符號(hào)引用。
字面量:文本字符串什乙、聲明為final的常量值等
符號(hào)引用:類和接口的全限定名挽封、字段名稱和描述符、方法的名稱和描述符

常量池的項(xiàng)目類型:

WechatIMG129.jpeg

常量池中的每一種類型都是一張表臣镣,且結(jié)構(gòu)各不相同辅愿。在java編譯期編譯java源文件時(shí),把源文件中的有關(guān)類忆某,字段点待,方法相關(guān)的信息全部放入class字節(jié)碼的常量池中,class文件中的字段表弃舒,方法表中可以通過常量池中的“常量”索引去訪問對應(yīng)的常量項(xiàng)癞埠,拿到類或方法,字段等信息聋呢。

java虛擬機(jī)在運(yùn)行java程序時(shí)燕差,首先去加載class文件,通過class文件坝冕,java虛擬機(jī)才知道對象有那些方法,字段瓦呼,然后去內(nèi)存分配空間喂窟,進(jìn)行運(yùn)算。

3.1 CONSTANT_Class_info

CONSTANT_Class_info

class_info表中tag所占1個(gè)字節(jié)央串,值為7磨澡,代表為class_info。index指向CONSTANT_Utf8_info表质和,其內(nèi)容為類的全限定名稳摄。

3.2 CONSTANT_Fieldref_info

CONSTANT_Fieldref_info

第一個(gè)index是聲明字段的類的CONSTANT_Class_info索引項(xiàng),通過這個(gè)索引可以知道字段是哪個(gè)類聲明的饲宿。
第二個(gè)index是CONSTANT_NameAndType的索引項(xiàng)厦酬。

3.3 CONSTANT_NameAndType

CONSTANT_NameAndType

CONSTANT_NameAndType中的內(nèi)容包含了字段的名稱描述符,描述符用來表示字段的數(shù)據(jù)類型(基本類型或者對象)瘫想。

3.4 CONSTANT_Method_Type_info

CONSTANT_Method_Type_info

四. 字段表
字段表

上表中name_index和descriptor_index都是對常量池的引用仗阅。name_index代表字段的名稱,descriptor_index代表字段的描述符国夜。

描述符

字段表集合中不會(huì)列出從超類或者父接口中繼承而來的字段减噪。
內(nèi)部類中為了保持對外部類的訪問性,會(huì)自動(dòng)添加指向外部類實(shí)例的字段。

五. 方法表
方法表

其中name_index和descriptor_index和屬性表中一樣筹裕,代表方法的名稱和方法的描述符醋闭。

六.屬性表

6.1 Code屬性

Code屬性

6.2 Exceptions屬性

Exceptions屬性

Exceptions屬性是列舉方法中可能拋出的受查異常,也就是throws關(guān)鍵子后面列舉的異常朝卒。

6.3 LocalVariableTable屬性

LocalVariableTable屬性

其中l(wèi)ocal_variable_info表示的方法中的形參和局部變量证逻。start_pc和length表示變量的作用域。

local_variable_info

6.4 ConstantValue屬性

ConstantValue屬性

ConstantValue屬性的作用是通知虛擬機(jī)自動(dòng)為靜態(tài)變量賦值扎运。
static類型的的變量瑟曲,有倆種賦值方式,一種是在類構(gòu)造器<clinit>方法中豪治,另一種是通過ConstantValue屬性洞拨。Sun Javac編譯器中,如果同時(shí)使用final和static來修飾一個(gè)變量负拟,并且這個(gè)變量的數(shù)據(jù)類型是基本類型或者String類型的話烦衣,就生成Constant屬性來進(jìn)行初始化。

6.5 InnerClasses 屬性
InnerClasses屬性用于記錄內(nèi)部類與宿主類之間的關(guān)聯(lián)掩浙。

InnerClasses 屬性

數(shù)據(jù)類number_of_classes代表需要記錄多少個(gè)內(nèi)部類花吟,每個(gè)內(nèi)部類的信息都由一個(gè)inner_classes_info表進(jìn)行描述。


inner_classes_info
  • inner_class_info_index和outer_class_info_index都是指向常量池中
    CONSTANT_Class_info型常量的索引
  • inner_name_index是指向常量池中CONSTANT_Utf8_info型常量的索引,代表這個(gè)類的名稱厨姚,如果是匿名內(nèi)部類衅澈,那么這項(xiàng)值為0.
  • inner_class_access_flags是內(nèi)部類的訪問標(biāo)志

6.6 Signature 屬性
Signature屬性記錄的是泛型簽名信息。java語言的泛型采用的是擦除法谬墙,在字節(jié)碼中今布,泛型信息都被擦除掉了。JDK1.5之后拭抬,任何類部默、接口、初始化方法或成員的泛型簽名中如果包含了類型變量或者“參數(shù)化類型”造虎,則Signature屬性會(huì)為它記錄泛型簽名信息傅蹂。

Signature 屬性

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市算凿,隨后出現(xiàn)的幾起案子份蝴,更是在濱河造成了極大的恐慌,老刑警劉巖澎媒,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搞乏,死亡現(xiàn)場離奇詭異,居然都是意外死亡戒努,警方通過查閱死者的電腦和手機(jī)请敦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門镐躲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侍筛,你說我怎么就攤上這事萤皂。” “怎么了匣椰?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵裆熙,是天一觀的道長。 經(jīng)常有香客問我禽笑,道長入录,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任佳镜,我火速辦了婚禮僚稿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蟀伸。我一直安慰自己蚀同,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布啊掏。 她就那樣靜靜地躺著蠢络,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迟蜜。 梳的紋絲不亂的頭發(fā)上刹孔,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音娜睛,去河邊找鬼芦疏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛微姊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播分预,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼兢交,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了笼痹?” 一聲冷哼從身側(cè)響起配喳,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凳干,沒想到半個(gè)月后晴裹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡救赐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年涧团,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泌绣,死狀恐怖钮追,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阿迈,我是刑警寧澤元媚,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站苗沧,受9級(jí)特大地震影響刊棕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜待逞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一甥角、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧飒焦,春花似錦蜈膨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至休雌,卻和暖如春灶壶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杈曲。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國打工驰凛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人担扑。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓恰响,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涌献。 傳聞我的和親對象是個(gè)殘疾皇子胚宦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容