【JVM】深入解析class類文件

眾所周知史侣,我們?cè)谶\(yùn)行java代碼時(shí),首先java文件會(huì)被編譯成class文件担钮,然后將class文件裝載到j(luò)ava虛擬機(jī)中暇榴。那么這個(gè)class文件到底是什么呢厚棵,今天我們就來分析一下。


首先編寫一個(gè)測(cè)試類Test蔼紧,內(nèi)容很簡(jiǎn)單婆硬,就是輸出“hello,world”


Test類
java文件以及編譯生成的class文件


使用WinHex工具打開這個(gè)Test.class文件奸例,會(huì)發(fā)現(xiàn)class文件內(nèi)容是這樣的:


class文件內(nèi)容的一部分

觀察這些數(shù)據(jù)彬犯,不難發(fā)現(xiàn),class文件是一組以8位字節(jié)為基本單位的二進(jìn)制流查吊,各個(gè)數(shù)據(jù)項(xiàng)目嚴(yán)格地按順序排列在一起谐区,中間沒有空隙。

那么圖中這些16進(jìn)制數(shù)據(jù)代表什么含義呢逻卖?

1.每個(gè)class文件開頭的4個(gè)字節(jié)稱為“魔數(shù)”宋列,即圖中的“CA FE BA BE”,(一個(gè)16進(jìn)制數(shù)代表4位,兩個(gè)就是8位评也,剛好是一個(gè)字節(jié))炼杖,這個(gè)魔數(shù)的作用就是:確定這個(gè)文件是否是一個(gè)能被JVM接受的class文件戈鲁。

2.緊接著魔數(shù)的4個(gè)字節(jié)是Class文件的版本號(hào),其中5嘹叫、6兩個(gè)字節(jié)是次版本號(hào)(0x0000),7和8兩個(gè)字節(jié)是主版本號(hào)(0x0035)诈乒,也即10進(jìn)制中的53罩扇,代表這個(gè)文件是能被jdk1.8或以上版本虛擬機(jī)執(zhí)行的class文件。

3.再往后怕磨,就是常量池的入口喂饥,常量池可以理解成class文件中的資源倉庫。在java中有三種常量池:String常量池肠鲫、運(yùn)行時(shí)常量池和class常量池员帮。而我們這里講的就是class常量池,class常量池主要存放字面量和符號(hào)引用导饲,由于不同class文件常量池中的常量數(shù)是不同的捞高,所以會(huì)有兩個(gè)字節(jié)表示常量池計(jì)數(shù)器,記錄了常量的個(gè)數(shù)渣锦。這里是001E,是十進(jìn)制中的30硝岗,表示有29項(xiàng)常量(第0項(xiàng)常量是空出來的)。緊接著后面的0A,是常量池第一項(xiàng)常量的標(biāo)志位袋毙,屬于CONSTANT_Methodref_info類型型檀,代表類中方法的符號(hào)引用。其后的16進(jìn)制數(shù)以此類推听盖。

4.在常量池結(jié)束以后的兩個(gè)字節(jié)代表訪問標(biāo)志胀溺,用于識(shí)別一些類或接口層次的訪問信息。比如皆看,這個(gè)class是類還是接口仓坞,是否定義成public等。

5.訪問標(biāo)志后面是類索引悬蔽、父類索引和接口索引集合扯躺,class文件由這三項(xiàng)數(shù)據(jù)來確定這個(gè)類的繼承關(guān)系。類索引確定這個(gè)類的全限定名蝎困,父類索引確定這個(gè)類的父類的全限定名录语,由于Object是所有java類的父類,所以除了Object之外禾乘,任何類的父類索引都不為0.接口索引集合描述這個(gè)類實(shí)現(xiàn)了哪些接口澎埠。

6.而在后面的是字段表集合、方法表集合和屬性表集合始藕,此處就不再做說明蒲稳,如果有對(duì)這些感興趣的氮趋,可以去查閱資料書,推薦周志明的《深入理解java虛擬機(jī)》(非打廣告)

PS:java虛擬機(jī)這方面相關(guān)知識(shí)會(huì)在面試時(shí)問到江耀,而且理解了java虛擬機(jī)的原理剩胁,會(huì)對(duì)我們寫出更高效的代碼有很大幫助。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子箫爷,更是在濱河造成了極大的恐慌,老刑警劉巖啊犬,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異壁查,居然都是意外死亡觉至,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門睡腿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來语御,“玉大人,你說我怎么就攤上這事席怪∥职担” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵何恶,是天一觀的道長孽锥。 經(jīng)常有香客問我,道長细层,這世上最難降的妖魔是什么惜辑? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮疫赎,結(jié)果婚禮上盛撑,老公的妹妹穿的比我還像新娘。我一直安慰自己捧搞,他們只是感情好抵卫,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胎撇,像睡著了一般介粘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晚树,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天姻采,我揣著相機(jī)與錄音,去河邊找鬼爵憎。 笑死慨亲,一個(gè)胖子當(dāng)著我的面吹牛婚瓜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刑棵,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼巴刻,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蛉签?” 一聲冷哼從身側(cè)響起冈涧,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎正蛙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體营曼,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乒验,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蒂阱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锻全。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖录煤,靈堂內(nèi)的尸體忽然破棺而出鳄厌,到底是詐尸還是另有隱情,我是刑警寧澤妈踊,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布了嚎,位于F島的核電站,受9級(jí)特大地震影響廊营,放射性物質(zhì)發(fā)生泄漏歪泳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一露筒、第九天 我趴在偏房一處隱蔽的房頂上張望呐伞。 院中可真熱鬧,春花似錦慎式、人聲如沸伶氢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽癣防。三九已至,卻和暖如春掌眠,著一層夾襖步出監(jiān)牢的瞬間劣砍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國打工扇救, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刑枝,地道東北人香嗓。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像装畅,于是被迫代替她去往敵國和親靠娱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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