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í)行該方法愧驱;