《Java核心技術(shù)系列:Java虛擬機(jī)規(guī)范(Java SE 8版)》由Oracle官方發(fā)布,Java虛擬機(jī)技術(shù)創(chuàng)建人撰寫,國內(nèi)資深Java技術(shù)專家翻譯。書中基于最新Java SE 8,完整且準(zhǔn)確地闡述Java虛擬機(jī)規(guī)范,是深度了解Java虛擬機(jī)和Java語言實(shí)現(xiàn)細(xì)節(jié)的必讀之作。
《Java核心技術(shù)系列:Java虛擬機(jī)規(guī)范(Java SE 8版)》共分7章。第1章從宏觀的角度介紹了Java虛擬機(jī)與Java的關(guān)系及發(fā)展歷程;第2章概述Java虛擬機(jī)的整體架構(gòu),包括class文件格式、數(shù)據(jù)類型、原始類型、引用類型、運(yùn)行時(shí)數(shù)據(jù)區(qū)、棧幀、浮點(diǎn)算法、異常等,這對理解本書后面的內(nèi)容有重要幫助;第3章詳述如何將Java語言編寫的程序轉(zhuǎn)換為Java虛擬機(jī)指令集,涉及常量、局部變量、控制結(jié)構(gòu)、算術(shù)運(yùn)算、參數(shù)接收、方法調(diào)用、數(shù)組、操作數(shù)棧、異常處理、同步與注解等;第4章深入分析用來表示編譯后的類和接口的class文件格式;第5章定義Java虛擬機(jī)啟動(dòng)以及類與接口的加載、鏈接和初始化過程;第6章闡釋并列舉Java虛擬機(jī)指令集;第7章提供一張以操作碼值為索引的Java虛擬機(jī)操作碼助記符表。
《Java核心技術(shù)系列:Java虛擬機(jī)規(guī)范(Java SE 8版)》完整而準(zhǔn)確地闡釋了Java虛擬機(jī)各方面的細(xì)節(jié),圍繞Java虛擬機(jī)整體架構(gòu)、編譯器、class文件格式、加載、鏈接與初始化、指令集等核心主題對Java虛擬機(jī)進(jìn)行全面而深入的分析,深刻揭示Java虛擬機(jī)的工作原理。同時(shí),書中不僅完整地講述了由Java SE 8所引入的新特性,例如對包含默認(rèn)實(shí)現(xiàn)代碼的接口方法所做的調(diào)用,還講述了為支持類型注解及方法參數(shù)注解而對class文件格式所做的擴(kuò)展,并闡明了class文件中各屬性的含義,以及字節(jié)碼驗(yàn)證的規(guī)則。
《Java核心技術(shù)系列:Java虛擬機(jī)規(guī)范(Java SE 8版)》主要內(nèi)容:
闡釋Java虛擬機(jī)與Java的關(guān)系和發(fā)展歷程。
概覽Java虛擬機(jī)整體架構(gòu),包括class文件格式、數(shù)據(jù)類型、原始類型、引用類型、運(yùn)行時(shí)數(shù)據(jù)區(qū)、棧幀、浮點(diǎn)算法、異常等。
詳述如何將以Java語言編寫的程序轉(zhuǎn)換為Java虛擬機(jī)指令集,涉及常量、局部變量、控制結(jié)構(gòu)、算術(shù)運(yùn)算、參數(shù)接收、方法調(diào)用、數(shù)組、操作數(shù)棧、異常處理、同步與注解等。
深入分析用來表示編譯后的類和接口的class文件格式,主要包括ClassFile文件結(jié)構(gòu)、描述符、常量池、字段、方法、屬性、格式檢查、代碼約束與class文件校驗(yàn)等。
定義Java虛擬機(jī)啟動(dòng)以及類和接口的加載、鏈接和初始化過程。
闡釋并列舉Java虛擬機(jī)指令集。
本書涵蓋了自2011年發(fā)布Java,SE 7版之后所發(fā)生的全部變化。此外,為了與常見的Java虛擬機(jī)實(shí)現(xiàn)相匹配,本書還添加了大量修訂及說明。
本版與前面各版一樣,僅僅描述了抽象的Java虛擬機(jī),而在實(shí)現(xiàn)具體的Java虛擬機(jī)時(shí),本書指出了設(shè)計(jì)規(guī)劃。Java虛擬機(jī)的實(shí)現(xiàn)必須體現(xiàn)出本書中的內(nèi)容,但僅在確有必要時(shí)才應(yīng)該受制于這些規(guī)范。
對于Java SE 8來說,Java編程語言里的一些重要變化在這本Java虛擬機(jī)規(guī)范中都有相應(yīng)的體現(xiàn)。為了盡量保持二進(jìn)制兼容性,我們應(yīng)該直接在Java虛擬機(jī)里指定帶有默認(rèn)實(shí)現(xiàn)代碼的default方法,而不應(yīng)該依賴于編譯器,因?yàn)槟菢幼鰧o法在不同廠商、不同版本的產(chǎn)品之間移植,此外,那種做法也不可能適用于已有的class文件。在設(shè)計(jì)JSR 335,也就是《Lambda Expressions for the Java Programming Language》(Java編程語言的lambda表達(dá)式)時(shí),Oracle公司的Dan Smith向虛擬機(jī)實(shí)現(xiàn)者咨詢了將default方法集成到常量池和方法結(jié)構(gòu)、方法與接口方法解析算法,以及字節(jié)碼指令集中的最佳方式。JSR 335也允許在class文件級別的接口里出現(xiàn)private方法與static方法,而這些方法也同接口方法解析算法緊密地結(jié)合起來了。
Java SE 8的特點(diǎn)之一是:Java SE平臺的程序庫也伴隨著Java虛擬機(jī)一起進(jìn)化。有個(gè)小例子可以很好地說明這一特點(diǎn):在運(yùn)行程序的時(shí)候,Java SE 8可以獲取方法的參數(shù)名,虛擬機(jī)會(huì)把這些名字存放在class文件結(jié)構(gòu)中,而與此同時(shí),java.lang.reflect.Parameter里也有個(gè)標(biāo)準(zhǔn)的API能夠查詢這些名字。另外,我們也可以通過class文件結(jié)構(gòu)中一項(xiàng)有趣的統(tǒng)計(jì)數(shù)據(jù)來說明這個(gè)特點(diǎn):本規(guī)范的第1版中定義了6個(gè)屬性,其中有3個(gè)屬性對Java虛擬機(jī)至關(guān)重要,而Java SE 8版的規(guī)范則定義了23個(gè)屬性,其中只有5個(gè)屬性對Java虛擬機(jī)很重要。換句話說,在新版規(guī)范中,屬性主要是為了支持程序庫而設(shè)計(jì)的,其次才是為了支持Java虛擬機(jī)本身。為了幫助讀者理解class文件結(jié)構(gòu),本規(guī)范會(huì)更為清晰地描述出每項(xiàng)屬性的角色及其使用限制。
在Oracle公司的Java Platform團(tuán)隊(duì)里,有多位同事都對這份規(guī)范提供了大力支持,他們包括:Mandy Chung、Joe Darcy、Joel Franck、Staffan Friberg、Yuri Gaevsky、Jon Gibbons、Jeannette Hung、Eric McCorkle、Matherey Nunez、Mark Reinhold、John Rose、Georges Saab、Steve Sides、Bernard Traversat、Michel Trudeau和Mikael Vidstedt。尤其感謝Dan Heidinga (IBM)、Karen Kinnear、Keith McGuigan及Harold Seigel,他們對常見的Java虛擬機(jī)實(shí)現(xiàn)中的兼容性及安全性貢獻(xiàn)良多。
Alex Buckley于加利福尼亞州圣克拉拉
蒂姆·林霍爾姆(Tim Lindholm),資深Java虛擬機(jī)高級架構(gòu)師,Java編程語言的主要貢獻(xiàn)者之一,曾是Sun公司杰出工程師,目前主要負(fù)責(zé)移動(dòng)設(shè)備上的Java應(yīng)用。在到Sun公司工作之前,他曾經(jīng)在美國阿貢國家實(shí)驗(yàn)室和Quintus公司從事與虛擬機(jī)和運(yùn)行時(shí)系統(tǒng)相關(guān)的工作。
弗蘭克·耶林(Frank Yellin),曾是Sun公司高級工程師,Java項(xiàng)目元老級成員。最近十余年中,他都從事著解釋型及編譯型語言的運(yùn)行時(shí)系統(tǒng)方面的工作。在到Sun公司工作之前,他在Lucid公司從事Common Lisp編譯器相關(guān)的工作。
吉拉德·布拉查(Gilad Bracha),Newspeak編程語言的創(chuàng)建者,曾是Sun公司杰出工程師。在到Sun公司工作之前,他在Animorphic Smalltalk System公司從事Strongtalk語言相關(guān)的工作。
亞歷克斯·巴克利(Alex Buckley),Oracle公司Java編程語言和Java虛擬機(jī)規(guī)范負(fù)責(zé)人。
譯者序
前言
第1章 引言
1.1 簡史
1.2 Java虛擬機(jī)
1.3 各章節(jié)摘要
1.4 說明
1.5 反饋
第2章 Java虛擬機(jī)結(jié)構(gòu)
2.1 class文件格式
2.2 數(shù)據(jù)類型
2.3 原始類型與值
2.3.1 整數(shù)類型與整型值
2.3.2 浮點(diǎn)類型、取值集合及浮點(diǎn)值
2.3.3 returnAddress類型和值
2.3.4 boolean類型
2.4 引用類型與值
2.5 運(yùn)行時(shí)數(shù)據(jù)區(qū)
2.5.1 pc寄存器
2.5.2 Java虛擬機(jī)棧
2.5.3 Java堆
2.5.4 方法區(qū)
2.5.5 運(yùn)行時(shí)常量池
2.5.6 本地方法棧
2.6 棧幀
2.6.1 局部變量表
2.6.2 操作數(shù)棧
2.6.3 動(dòng)態(tài)鏈接
2.6.4 方法調(diào)用正常完成
2.6.5 方法調(diào)用異常完成
2.7 對象的表示
2.8 浮點(diǎn)算法
2.8.1 Java虛擬機(jī)和IEEE,754中的浮點(diǎn)算法
2.8.2 浮點(diǎn)模式
2.8.3 數(shù)值集合轉(zhuǎn)換
2.9 特殊方法
2.10 異常
2.11 字節(jié)碼指令集簡介
2.11.1 數(shù)據(jù)類型與Java虛擬機(jī)
2.11.2 加載和存儲指令
2.11.3 算術(shù)指令
2.11.4 類型轉(zhuǎn)換指令
2.11.5 對象的創(chuàng)建與操作
2.11.6 操作數(shù)棧管理指令
2.11.7 控制轉(zhuǎn)移指令
2.11.8 方法調(diào)用和返回指令
2.11.9 拋出異常
2.11.10 同步
2.12 類庫
2.13 公有設(shè)計(jì)、私有實(shí)現(xiàn)
第3章 Java虛擬機(jī)編譯器
3.1 示例的格式說明
3.2 常量、局部變量和控制結(jié)構(gòu)的使用
3.3 算術(shù)運(yùn)算
3.4 訪問運(yùn)行時(shí)常量池
3.5 與控制結(jié)構(gòu)有關(guān)的更多示例
3.6 接收參數(shù)
3.7 方法調(diào)用
3.8 使用類實(shí)例
3.9 數(shù)組
3.10 編譯switch語句
3.11 使用操作數(shù)棧
3.12 拋出異常和處理異常
3.13 編譯finally語句塊
3.14 同步
3.15 注解
第4章 class文件格式
4.1 ClassFile結(jié)構(gòu)
4.2 各種名稱的內(nèi)部表示形式
4.2.1 類和接口的二進(jìn)制名稱
4.2.2 非限定名
4.3 描述符
4.3.1 語法符號
4.3.2 字段描述符
4.3.3 方法描述符
4.4 常量池
4.4.1 CONSTANT_Class_info結(jié)構(gòu)
4.4.2 CONSTANT_Fieldref_info、CONSTANT_Methodref_info和CONSTANT_InterfaceMethodref_info結(jié)構(gòu)
4.4.3 CONSTANT_String_info結(jié)構(gòu)
4.4.4 CONSTANT_Integer_info和CONSTANT_Float_info結(jié)構(gòu)
4.4.5 CONSTANT_Long_info和CONSTANT_Double_info結(jié)構(gòu)
4.4.6 CONSTANT_NameAnd-Type_info結(jié)構(gòu)
4.4.7 CONSTANT_Utf8_info結(jié)構(gòu)
4.4.8 CONSTANT_MethodHandle_info結(jié)構(gòu)
4.4.9 CONSTANT_MethodType_info結(jié)構(gòu)
4.4.10 CONSTANT_Invoke-Dynamic_info結(jié)構(gòu)
4.5 字段
4.6 方法
4.7 屬性
4.7.1 自定義和命名新的屬性
4.7.2 ConstantValue屬性
4.7.3 Code屬性
4.7.4 StackMapTable屬性
4.7.5 Exceptions屬性
4.7.6 InnerClasses屬性
4.7.7 EnclosingMethod屬性
4.7.8 Synthetic屬性
4.7.9 Signature屬性
4.7.10 SourceFile屬性
4.7.11 SourceDebugExtension屬性
4.7.12 LineNumberTable屬性
4.7.13 LocalVariableTable屬性
4.7.14 LocalVariableTypeTable屬性
4.7.15 Deprecated屬性
4.7.16 RuntimeVisibleAnnota-tions屬性
4.7.17 RuntimeInvisible-Annotations屬性
4.7.18 RuntimeVisibleParameterAnnotations屬性
4.7.19 RuntimeInvisiblePara-meterAnnotations屬性
4.7.20 RuntimeVisibleTypeAnnotations屬性
4.7.21 RuntimeInvisibleType-Annotations屬性
4.7.22 AnnotationDefault屬性
4.7.23 BootstrapMethods屬性
4.7.24 MethodParameters屬性
4.8 格式檢查
4.9 Java虛擬機(jī)代碼約束
4.9.1 靜態(tài)約束
4.9.2 結(jié)構(gòu)化約束
4.10 class文件校驗(yàn)
4.10.1 類型檢查驗(yàn)證
4.10.2 類型推導(dǎo)驗(yàn)證
4.11 Java虛擬機(jī)限制
第5章 加載、鏈接與初始化
5.1 運(yùn)行時(shí)常量池
5.2 虛擬機(jī)啟動(dòng)
5.3 創(chuàng)建和加載
5.3.1 使用引導(dǎo)類加載器來加載類型
5.3.2 使用用戶自定義類加載器來加載類型
5.3.3 創(chuàng)建數(shù)組類
5.3.4 加載限制
5.3.5 從class文件表示得到類
5.4 鏈接
5.4.1 驗(yàn)證
5.4.2 準(zhǔn)備
5.4.3 解析
5.4.4 訪問控制
5.4.5 方法覆蓋
5.5 初始化
5.6 綁定本地方法實(shí)現(xiàn)
5.7 Java虛擬機(jī)退出
第6章 Java虛擬機(jī)指令集
6.1 設(shè)定:“必須”的含義
6.2 保留操作碼
6.3 虛擬機(jī)錯(cuò)誤
6.4 指令描述格式
6.5 指令集描述
第7章 操作碼助記符
附錄A Limited License Grant