Java字節(jié)碼結(jié)構(gòu)解析

本文通過解析Class文件中字節(jié)碼的結(jié)構(gòu)牙瓢,來加深對(duì)Java類文件結(jié)構(gòu)的理解毡代。建議先閱讀Java類文件結(jié)構(gòu)解析這篇文章阅羹。

Test.java

package org.tianbin.clazz;

public class Test{
    private int m;

    public int inc(){
        return m + 1;
    }
}

Test.class

CA FE BA BE 00 00 00 34 00 13 0A 00 04 00 0F 09 00 03 00 10 07 00 
11 07 00 12 01 00 01 6D 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 69 6E 63 01 00 03 28 29 49 01 00 
0A 53 6F 75 72 63 65 46 69 6C 65 01 00 09 54 65 73 74 2E 6A 61 76 
61 0C 00 07 00 08 0C 00 05 00 06 01 00 16 6F 72 67 2F 74 69 61 6E 
62 69 6E 2F 63 6C 61 7A 7A 2F 54 65 73 74 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 03 00 01 00 0B 00 0C 00 01 00 09 00 00 00 1F 
00 02 00 01 00 00 00 07 2A B4 00 02 04 60 AC 00 00 00 01 00 0A 00 
00 00 06 00 01 00 00 00 07 00 01 00 0D 00 00 00 02 00 0E

魔數(shù)

CA FE BA BE

class文件的頭4個(gè)字節(jié),用于驗(yàn)證該文件是否能夠被虛擬機(jī)接受

主次版本號(hào)

00 00 00 34

魔數(shù)后4個(gè)字節(jié)教寂,第5個(gè)和第6個(gè)字節(jié)是次版本號(hào)(Minor Version)捏鱼,第7個(gè)和第8個(gè)字節(jié)是主版本號(hào)(Major Version),Test.java文件使用JDK1.8進(jìn)行編譯,所以主版本號(hào)為00 34酪耕,十進(jìn)制表示為52导梆。

常量池

結(jié)構(gòu):容量計(jì)數(shù)器(u2類型) + 常量

00 13

容量計(jì)算器,計(jì)數(shù)從1開始迂烁,目的是滿足某些常量池的索引值的數(shù)據(jù)在特定情況下需要表達(dá)“不引用任何一個(gè)常量池”的含義看尼。當(dāng)前容量計(jì)算器值為19,表示常量池中有18項(xiàng)常量婚被,索引值范圍為1~18。

常量1

0A 
00 04           //java/lang/Object      
00 0F           //<init>
字節(jié)碼 結(jié)構(gòu) 含義
0A tag 值為10梳虽,CONSTANT_Methodref_info
00 04 index 指向聲明方法的類描述符CONSTANT_Class_info的索
00 0F index 指向名稱及類型描述符CONSTANT_NameAndType的索引項(xiàng)

常量2

09 
00 03       //org/tianbin/clazz/Test
00 10       //m
字節(jié)碼 結(jié)構(gòu) 含義
09 tag 值為9址芯,CONSTANT_Fieldref_info
00 03 index 指向聲明字段的類或者接口描述符CONSTANT_Class_info的索引項(xiàng)
00 10 index 指向字段描述符CONSTANT_NameAndType的索引項(xiàng)

常量3

07          
00 11       //常量17      org/tianbin/clazz/Test
字節(jié)碼 結(jié)構(gòu) 含義
07 tag 值為7,CONSTANT_Class_info
00 11 index 指向全限定名常量項(xiàng)的索引

常量4

07 
00 12       //常量18      java/lang/Object

結(jié)構(gòu)見常量3

常量5

01 
00 01
6D      //m
字節(jié)碼 結(jié)構(gòu) 含義
01 tag 值為1窜觉,CONSTANT_Utf8_info
00 01 length UTF-8編碼字符串占用的字節(jié)數(shù)
6D bytes 長(zhǎng)度為length的UTF-8編碼的字符串

常量6

01 
00 01
49      //I

結(jié)構(gòu)見常量5

常量7

01
00 06
3C 69 6E 69 74 3E   //<init>

結(jié)構(gòu)見常量5

常量8

01 
00 03
28 29 56    //()V

結(jié)構(gòu)見常量5

常量9

01 
00 04 
43 6F 64 65     //Code

結(jié)構(gòu)見常量5

常量10

01 
00 0F 
4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65    //LineNumberTable

結(jié)構(gòu)見常量5

常量11

01      
00 03
69 6E 63    //inc

結(jié)構(gòu)見常量5

常量12

01      
00 03
28 29 49    //()I

結(jié)構(gòu)見常量5

常量13

01      
00 0A
53 6F 75 72 63 65 46 69 6C 65   //SourceFile

結(jié)構(gòu)見常量5

常量14

01 
00 09
54 65 73 74 2E 6A 61 76 61  //Test.java 

結(jié)構(gòu)見常量5

常量15

0C  
00 07   
00 08
字節(jié)碼 結(jié)構(gòu) 含義
0C tag 值為12谷炸,CONSTANT_NameAndType_info
00 07 index 指向該字段或方法名稱常量的索引
00 08 index 指向該字段或方法描述符常量項(xiàng)的索引

常量16

0C  
00 05
00 06

結(jié)構(gòu)見常量15

常量17

01      
00 16
6F 72 67 2F 74 69 61 6E 62 69 6E 2F 63 6C 61 7A 7A 2F 54 65 73 74   //org/tianbin/clazz/Test    

結(jié)構(gòu)見常量5

常量18

01      
00 10
6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74     //java/lang/Object      

結(jié)構(gòu)見常量5

訪問標(biāo)志

00 21

常量池之后兩個(gè)字節(jié)標(biāo)識(shí)類的訪問標(biāo)志,用于識(shí)別一些類或者接口層次的訪問信息禀挫。

類索引旬陡、父類索引、接口索引

00 03   類索引         //org/tianbin/clazz/Test
00 04   父類索引        //java/lang/Object      
00 00   接口索引集合大小

字段表集合

00 01   fields_count
00 02   access_flags
00 05   name_index          //m
00 06   descriptor_index
00 00   attributes_count

方法表集合

00 02           method_count        //<init>  inc

init

字節(jié)碼 結(jié)構(gòu)名稱 含義
00 01 access_flag
00 07 name_index <init>
00 08 descriptor_index
00 01 attributes_count
00 09 attributes_name_index Code
00 00 00 1D attribute_length
00 01 max_stack
00 01 max_local
00 00 00 05 code_length
2A B7 00 01 B1 code
00 00 exception_table_length
00 01 attributes_count
00 0A attributes_name_index LineNumberTable
00 00 00 06 attribute_length
00 01 line_number_table_length
00 00 start_pc
00 03 line_number

inc

字節(jié)碼 結(jié)構(gòu)名稱 含義
00 01 access_flag
00 0B name_index inc
00 0C descriptor_index
00 01 attributes_count
00 09 attributes_name_index Code
00 00 00 1F attribute_length
00 02 max_stack
00 01 max_local
00 00 00 07 code_length
2A B4 00 02 04 60 AC code
00 00 exception_table_length
00 01 attributes_count
00 0A attributes_name_index LineNumberTable
00 00 00 06 attribute_length
00 01 line_number_table_length
00 00 start_pc
00 07 line_number

Class文件的屬性表

00 01屬性表的大小

SourceFile屬性

00 0D           attribute_name_index
00 00 00 02     attribute_length        
00 0E           sourcefile_index        //Test.java 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末语婴,一起剝皮案震驚了整個(gè)濱河市描孟,隨后出現(xiàn)的幾起案子驶睦,更是在濱河造成了極大的恐慌,老刑警劉巖匿醒,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件场航,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡廉羔,警方通過查閱死者的電腦和手機(jī)溉痢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憋他,“玉大人孩饼,你說我怎么就攤上這事≈竦玻” “怎么了镀娶?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)此迅。 經(jīng)常有香客問我汽畴,道長(zhǎng),這世上最難降的妖魔是什么耸序? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任忍些,我火速辦了婚禮,結(jié)果婚禮上坎怪,老公的妹妹穿的比我還像新娘罢坝。我一直安慰自己,他們只是感情好搅窿,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布嘁酿。 她就那樣靜靜地躺著,像睡著了一般男应。 火紅的嫁衣襯著肌膚如雪闹司。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天沐飘,我揣著相機(jī)與錄音游桩,去河邊找鬼。 笑死耐朴,一個(gè)胖子當(dāng)著我的面吹牛借卧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筛峭,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼铐刘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了影晓?” 一聲冷哼從身側(cè)響起镰吵,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤檩禾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后捡遍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锌订,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年画株,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辆飘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谓传,死狀恐怖蜈项,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情续挟,我是刑警寧澤紧卒,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站诗祸,受9級(jí)特大地震影響跑芳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜直颅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一博个、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧功偿,春花似錦盆佣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吨瞎,卻和暖如春痹兜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颤诀。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工字旭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人着绊。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓谐算,卻偏偏與公主長(zhǎng)得像熟尉,于是被迫代替她去往敵國(guó)和親归露。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法斤儿,類相關(guān)的語法剧包,內(nèi)部類的語法恐锦,繼承相關(guān)的語法,異常的語法疆液,線程的語...
    子非魚_t_閱讀 31,662評(píng)論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理一铅,服務(wù)發(fā)現(xiàn),斷路器堕油,智...
    卡卡羅2017閱讀 134,699評(píng)論 18 139
  • 本文是《深入理解Java虛擬機(jī)》中類文件結(jié)構(gòu)一章的讀書筆記潘飘。另外,推薦閱讀Java字節(jié)碼結(jié)構(gòu)解析來加深理解掉缺。 Cl...
    tianbin閱讀 2,459評(píng)論 0 6
  • 人的一生卜录,沒有誰事事得意,處處風(fēng)光眶明。 告訴自己艰毒,淡然一些,看開一點(diǎn)搜囱, 生活的過程中保持一種平常心態(tài)丑瞧, 淡然而簡(jiǎn)單,...
    風(fēng)芷閱讀 525評(píng)論 0 2
  • 1 公園里的鳥蜀肘。情人節(jié)的早上到公園里跑步绊汹。又路過那個(gè)亭子,記得我在一篇文章里說到倦鳥歸巢的那個(gè)亭子嗎幌缝, 就是那里灸促。...
    柳二白閱讀 193評(píng)論 0 2