很大氣的網(wǎng)站 營銷網(wǎng)絡(luò)營銷的認(rèn)知
第6章 類文件結(jié)構(gòu)
6.1 概述
略
6.2 無關(guān)性的基石
1.平臺(tái)無關(guān)性:可在各os的JVM重運(yùn)行
2.語言無關(guān)性:無關(guān)語言,只要可以編譯成.class文件,便可以在JVM上運(yùn)行
6.3 class類文件的結(jié)構(gòu)
.class文件也可以直接動(dòng)態(tài)生成送入類加載器,并不一定需要存在文件,但動(dòng)態(tài)生成的格式也是確定的。
.class中有兩種數(shù)據(jù)類型
1>無符號(hào)數(shù):U1、U2、U4、U8,表示數(shù)字、索引引用,UTF-8等。
2>表:由多個(gè)無符號(hào)數(shù)或其他表構(gòu)成的復(fù)合數(shù)據(jù)類型
6.3.1 魔數(shù)與class文件的版本
.class文件開頭為一個(gè)四字節(jié)的魔數(shù),他代表著該文件為JVM可執(zhí)行文件
【因?yàn)閿U(kuò)展名可以隨意改動(dòng),所以很多很多時(shí)候使用文件開頭的魔數(shù)判斷文件類型】
.class文件5、6字節(jié)為次版本號(hào),7、8字節(jié)為主版本號(hào),JVM只能執(zhí)行比自己版本低的calss文件
6.3.2 常量池
目前有17種常量,主要常量有兩大類:
1>字面量:文本字符串與final常量值
2>符號(hào)引用:P218
各常量表格式“P222
6.3.3 訪問標(biāo)志
標(biāo)識(shí)類是否為抽象類,是否為借口、是否final等,占用兩字節(jié),供16各標(biāo)志位
6.3.4 類索引,父類索引與接口索引集合
類索引,父類索引用同一個(gè)U2表示,接口索引由集合表示,指向一個(gè)類描述符常量,常量中的索引值又指向全限定名字符串
6.4.5 字段表集合
1>字段訪問標(biāo)志:是否public、是否static、volatile等
2>簡單名稱與描述符
3>額外信息,如初始值指針
6.3.6 方發(fā)表集合
同上,方法字節(jié)碼存放在code屬性表集合中,可能添加.java中不存在的構(gòu)造器方法,還有比如內(nèi)部類訪問外部的指針等
6.3.7 屬性表集合
目前有29種屬性表
P230
6.4 字節(jié)碼指令簡介
Java虛擬機(jī)指令由操作碼及0-多個(gè)操作數(shù)構(gòu)成,面向操作數(shù)棧。
6.4.1 字節(jié)碼與數(shù)據(jù)類型
Java編譯器會(huì)在編譯/運(yùn)行期間將byte、short、boolean、char轉(zhuǎn)換為int類型數(shù)據(jù),并使用int操作指令運(yùn)算。
6.4.2 加載和存儲(chǔ)指令
將數(shù)據(jù)在局部變量表和操作數(shù)棧之間來回傳輸
6.4.3 運(yùn)算指令
數(shù)學(xué)運(yùn)算、位運(yùn)算、比較指令等
6.4.4 類型轉(zhuǎn)換指令
小轉(zhuǎn)大范圍:安全轉(zhuǎn)化
大轉(zhuǎn)小范圍:可能丟失精度
6.4.5 對象創(chuàng)建與訪問指令
對象創(chuàng)建與訪問字段、取數(shù)組長度、類型檢查等
6.4.6 操作數(shù)棧管理指令
操作操作數(shù)棧
6.4.7 控制轉(zhuǎn)移指令
條件分支指令,可修改PC寄存器的值來改變執(zhí)行的語句
6.4.8 方法調(diào)用和返回指令
調(diào)用各種方法
6.4.9 異常處理指令
athrow顯示拋出異常(throw語句)
6.4.10 同步指令
monitorenter與monitorexit支持synchronized關(guān)鍵字
6.5 公有設(shè)計(jì),私有實(shí)現(xiàn)
在滿足<<Java虛擬機(jī)規(guī)范>>的前提下,各組織可以自行實(shí)現(xiàn)JVM,并使用各種優(yōu)化
6.6 class文件結(jié)構(gòu)的發(fā)展
略