Java虛擬機(jī)類文件結(jié)構(gòu)

Java虛擬機(jī)類文件結(jié)構(gòu)

一哭靖、無關(guān)性的基石

java通過java虛擬機(jī)實(shí)現(xiàn)一次編寫砖茸,到處運(yùn)行
java 虛擬機(jī)不和包括java在內(nèi)的任何語言綁定侣诵,它只與“class 文件”這種特定的二進(jìn)制文件格式關(guān)聯(lián),class文件包含了Java虛擬機(jī)指令集
和符號表以及其他輔助信息边苹。

二陵且、Class類文件的結(jié)構(gòu)

1、Class文件是一組以8位字節(jié)為基礎(chǔ)單位的二進(jìn)制流勾给,各個(gè)數(shù)據(jù)項(xiàng)目嚴(yán)格按照順序緊湊的排列在Class文件中滩报,中間沒有任何分隔符锅知;
當(dāng)遇到占用8位字節(jié)以上的空間數(shù)據(jù)項(xiàng)時(shí),會(huì)按照高位在前(大端)的方式分割成若干個(gè)8位字節(jié)進(jìn)行存儲(chǔ)脓钾。
Class文件存儲(chǔ)數(shù)據(jù)類型:無符號數(shù)和表
無符號數(shù):基本的數(shù)據(jù)類型售睹,以u1、u2可训、u4昌妹、u8代表1個(gè)字節(jié),2個(gè)字節(jié)握截,4個(gè)字節(jié)飞崖,8個(gè)字節(jié)的無符號數(shù);無符號數(shù)可以用來描述數(shù)字谨胞、索引引用固歪、
數(shù)量值、活字符串值胯努。

表:由多個(gè)無符號數(shù)或者其他表作為數(shù)據(jù)項(xiàng)構(gòu)成的復(fù)合數(shù)據(jù)類型牢裳,習(xí)慣以_info結(jié)尾。

Class文件格式

類型 名稱 數(shù)量
u4 magic(魔數(shù):Class文件是否能被虛擬機(jī)接受) 1
u2 minor_version(次版本號) 1
u2 major_version(主版本號:jdk 1.7 51.0;1.6 50) 1
u2 constant_pool_count(常量池容量) 1
cp_info constant_pool(常量池:存放字面量(文本字符串等)叶沛、符號引用:類蒲讯、接口全限定名,字段灰署、方法名稱和描述符) constant_pool_count-1
u2 access_flag(訪問標(biāo)志:類還是接口判帮;是否為public、abstract溉箕、final等) 1
u2 this_class(類索引:確定該類全限定名) 1
u2 super_class(父類索引:確定父類全限定名) 1
u2 interfaces_count(接口索引集合容量) 1
u2 interfaces(接口索引集合:描述該類實(shí)現(xiàn)了哪些接口) interfaces_count
u2 fields_count(字段表集合容量) 1
field_info fields(字段表集合:描述變量晦墙,不包含局部變量) fields_count
u2 methods_count(方法集合容量) 1
method_info methods(方法集合:描述方法) methods_count
u2 attributes_count 1
attribute_info attributes(屬性表集合:描述某些場景專有信息,例如code屬性存放方法中的java字節(jié)碼指令) attributes_count

方法里的Java代碼,經(jīng)過編譯器編譯成字節(jié)碼指令后约巷,存放在屬性表集合中的Code屬性里偎痛。

Code屬性是Class文件中最重要的一個(gè)屬性,如果把一個(gè)Java程序中的信息分為代碼(Code,方法體里面的Java代碼)和元數(shù)據(jù)(Metadata,包括
類独郎、字段、方法定義及其他信息)兩部分枚赡,那么整個(gè)Class文件中氓癌,Code屬性用于描述代碼,所有的其他數(shù)據(jù)項(xiàng)目都用于描述元數(shù)據(jù)贫橙。

三贪婉、字節(jié)碼指令

Java虛擬機(jī)的指令由一個(gè)字節(jié)長度的、代表特定操作含義的數(shù)字(操作碼)以及跟隨其后的操作所需參(操作數(shù))數(shù)構(gòu)成卢肃。

java虛擬機(jī)指令集所支持的數(shù)據(jù)類型

opcode(操作碼) byte short int long float double char reference
Tipush:將一個(gè)常量加載到操作數(shù)棧 bipush sipush
Tconst iconst lconst fconst dconst aconst
Tload:將一個(gè)局部變量加載到操作棧 iload lload fload dload aload
Tstore:將一個(gè)數(shù)值從操作數(shù)棧存儲(chǔ)到局部變量表 istore lstore fstore dstore astore
Taload:將一個(gè)數(shù)組元素加載到操作棧 baload saload iaload laload faload daload caload aaload
Tastore:將一個(gè)數(shù)值從操作數(shù)棧存儲(chǔ)到數(shù)組元素 basotre sastore iastore lastore fastore dastore castore aastore
Tadd:加法指令 iadd ladd fadd dadd
Tsub:減法指令 isub lsub fsub dsub
Tmul:乘法指令 imul lmul fmul dnul
Tdiv:除法指令 idiv ldiv fdiv ddiv
Trem:求余指令 irem lrem frem drem
Tneg:取反指令 ineg lneg fneg dneg
Tshl:左移指令 ishl lshl
Tshr:右移指令 ishr lshr
Tushr:符號右移指令 iushr lushr
Tor:按位或指令 ior lor
Tand:按位與指令 iand land
Txor:按位異或指令 ixor lxor
i2T:類型轉(zhuǎn)換 i2b i2s i2l i2f i2d
l2T:類型轉(zhuǎn)換 l2i l2f l2d
f2T:類型轉(zhuǎn)換 f2i f2l f2d
d2T:類型轉(zhuǎn)換 d2i d2l d2f
Tcmp:比較指令 lcmp
Tcmpl:比較指令 fcmpl dcmpl
Tcmpg:比較指令 fcmpg dcmpg
if_TcmpOP:控制轉(zhuǎn)移指令 if_icmpOP
Treturn:方法返回指令 ireturn lreturn freturn dreturn areturn

除表中指令外還有:

1疲迂、對方創(chuàng)建與訪問指令:

  • 創(chuàng)建類實(shí)例指令:new
  • 創(chuàng)建數(shù)組指令:newarray才顿、anewarray、multianewarray
  • 訪問類字段(static字段尤蒿、或者稱為類變量)和實(shí)例字段(非static字段郑气,或者稱為實(shí)例變量)指令:getfield、getstatic腰池、putfield尾组、putstatic
  • 取數(shù)組長度指令:arraylength
  • 檢查類實(shí)例類型指令:instanceof、checkcast

2示弓、操作數(shù)棧管理指令:直接操作操作數(shù)棧

  • 將操作數(shù)棧的棧頂一個(gè)或兩個(gè)元素出棧:pop讳侨、pop2
  • 復(fù)制棧頂一個(gè)或兩個(gè)數(shù)字并將復(fù)制值雙份的復(fù)制值重新壓入棧頂:dup、dup2、dup_x1明吩、dup2_x1锐朴、dup_x2、dup2_x2
  • 將棧頂端兩個(gè)數(shù)值交換:swap

3勇婴、方法調(diào)用指令

  • invokevirtual:用于調(diào)用對象的實(shí)例方法,根據(jù)對象的實(shí)際類型進(jìn)行分派
  • invokeinterface:調(diào)用接口方法铆帽,在運(yùn)行時(shí)搜索一個(gè)實(shí)現(xiàn)接口的方法對象咆耿,找出適合的方法進(jìn)調(diào)用
  • invokespecial:調(diào)用一下需要特殊處理的實(shí)例方法,包括實(shí)例初始化方法爹橱、私有方法萨螺、父類方法
  • invokestatic:調(diào)用類方法(static方法)
  • invokedynamic:在運(yùn)行時(shí)動(dòng)態(tài)解析出調(diào)用點(diǎn)限定符所引用的方法,并執(zhí)行該方法愧驱;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慰技,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子组砚,更是在濱河造成了極大的恐慌吻商,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糟红,死亡現(xiàn)場離奇詭異艾帐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)盆偿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門柒爸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捎稚,你說我怎么就攤上這事。” “怎么了今野?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵葡公,是天一觀的道長蛔外。 經(jīng)常有香客問我,道長豹爹,這世上最難降的妖魔是什么臂聋? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮肄方,結(jié)果婚禮上权她,老公的妹妹穿的比我還像新娘隅要。我一直安慰自己廓啊,他們只是感情好封豪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布雌续。 她就那樣靜靜地躺著驯杜,像睡著了一般鸽心。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音怠惶,去河邊找鬼策治。 笑死揽祥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的料按。 我是一名探鬼主播载矿,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逃贝!你這毒婦竟也來了泥从?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旬盯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奸晴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了极景。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喜庞。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡延都,死狀恐怖雷猪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晰房,我是刑警寧澤求摇,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布射沟,位于F島的核電站,受9級特大地震影響与境,放射性物質(zhì)發(fā)生泄漏验夯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一摔刁、第九天 我趴在偏房一處隱蔽的房頂上張望挥转。 院中可真熱鬧,春花似錦共屈、人聲如沸绑谣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽借宵。三九已至,卻和暖如春矾削,著一層夾襖步出監(jiān)牢的瞬間壤玫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工哼凯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欲间,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓挡逼,卻偏偏與公主長得像括改,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子家坎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

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