自己動手寫Java虛擬機

Java虛擬機非常複雜,要想真正理解它的工作原理,最好的方式就是自己動手編寫一個。

本書是繼《深入理解Java虛擬機》之後的又一經典著作,它一方面遵循《Java虛擬機規範》,一方面又獨闢蹊徑,不僅能讓Java虛擬機的學習變得更加簡單和有趣,而且能讓你對Java虛擬機的原理認識更深入和更深刻。

本書摒棄了傳統的以解讀枯燥的Java虛擬機規範文檔和分析繁瑣的Java虛擬機原始碼的方式來講解Java虛擬機,取而代之的是,以實踐的方式,引導讀者如何從零開始構建和實現一個Java虛擬機,整個過程不僅能讓讀者做到對Java虛擬機知其然而且知其所以然,還能禁止大量不必要的繁瑣細節,體會到實現過程中的成就感,讓學習過程更加輕鬆、愉悅和高效。更重要的是,這種方式能引導讀者更深入地認識和掌握Java虛擬機的工作原理。

1.前言

2.第1章 命令行工具

3.1.1 準備工作

4.1.1.1 安裝JDK

5.1.1.2 安裝Go

6.1.1.3 創建目錄結構

7.1.2 java命令

8.1.3 編寫命令行工具

9.1.4 測試本章代碼

10.1.5 本章小結

11.第2章 搜尋class檔案

12.2.1 類路徑

13.2.2 準備工作

14.2.3 實現類路徑

15.2.3.1 Entry接口

16.2.3.2 DirEntry

17.2.3.3 ZipEntry

18.2.3.4 CompositeEntry

19.2.3.5 WildcardEntry

20.2.3.6 Classpath

21.2.4 測試本章代碼

22.2.5 本章小結

23.第3章 解析class檔案

24.3.1 class檔案

25.3.2 解析class檔案

26.3.2.1 讀取數據

27.3.2.2 整體結構

28.3.2.3 魔數

29.3.2.4 版本號

30.3.2.5 類訪問標誌

31.3.2.6 類和超類索引

32.3.2.7 接口索引表

33.3.2.8 欄位和方法表

34.3.3 解析常量池

35.3.3.1 ConstantPool結構體

36.3.3.2 ConstantInfo接口

37.3.3.3 CONSTANT_Integer_info

38.3.3.4 CONSTANT_Float_info

39.3.3.5 CONSTANT_Long_info

40.3.3.6 CONSTANT_Double_info

41.3.3.7 CONSTANT_Utf8_info

42.3.3.8 CONSTANT_String_info

43.3.3.9 CONSTANT_Class_info

44.3.3.10 CONSTANT_NameAndType_info

45.3.3.11 CONSTANT_Fieldref_info、CONSTANT_Methodref_info和CONSTANT_InterfaceMethodref_info

46.3.3.12 常量池小結

47.3.4 解析屬性表

48.3.4.1 AttributeInfo接口

49.3.4.2 Deprecated和Synthetic屬性

50.3.4.3 SourceFile屬性

51.3.4.4 ConstantValue屬性

52.3.4.5 Code屬性

53.3.4.6 Exceptions屬性

54.3.4.7 LineNumberTable和LocalVariableTable屬性

55.3.5 測試本章代碼

56.3.6 本章小結

57.第4章 運行時數據區

58.4.1 運行時數據區概述

59.4.2 數據類型

60.4.3 實現運行時數據區

61.4.3.1 執行緒

62.4.3.2 Java虛擬機棧

63.4.3.3 幀

64.4.3.4 局部變數表

65.4.3.5 運算元棧

66.4.3.6 局部變數表和運算元棧實例分析

67.4.4 測試本章代碼

68.4.5 本章小結

69.第5章 指令集和解釋器

70.5.1 位元組碼和指令集

71.5.2 指令和指令解碼

72.5.2.1 Instruction接口

73.5.2.2 BytecodeReader

74.5.3 常量指令

75.5.3.1 nop指令

76.5.3.2 const系列指令

77.5.3.3 bipush和sipush指令

78.5.4 載入指令

79.5.5 存儲指令

80.5.6 棧指令

81.5.6.1 pop和pop2指令

82.5.6.2 dup指令

83.5.6.3 swap指令

84.5.7 數學指令

85.5.7.1 算術指令

86.5.7.2 位移指令

87.5.7.3 布爾運算指令

88.5.7.4 iinc指令

89.5.8 類型轉換指令

90.5.9 比較指令

91.5.9.1 lcmp指令

92.5.9.2 fcmp和dcmp指令

93.5.9.3 if指令

94.5.9.4 if_icmp指令

95.5.9.5 if_acmp指令

96.5.10 控制指令

97.5.10.1 goto指令

98.5.10.2 tableswitch指令

99.5.10.3 lookupswitch指令

100.5.11 擴展指令

101.5.11.1 wide指令

102.5.11.2 ifnull和ifnonnull指令

103.5.11.3 goto_w指令

104.5.12 解釋器

105.5.13 測試本章代碼

106.5.14 本章小結

107.第6章 類和對象

108.6.1 方法區

109.6.1.1 類信息

110.6.1.2 欄位信息

111.6.1.3 方法信息

112.6.1.4 其他信息

113.6.2 運行時常量池

114.6.2.1 類符號引用

115.6.2.2 欄位符號引用

116.6.2.3 方法符號引用

117.6.2.4 接口方法符號引用

118.6.3 類載入器

119.6.3.1 readClass()

120.6.3.2 defineClass()

121.6.3.3 link()

122.6.4 對象、實例變數和類變數

123.6.5 類和欄位符號引用解析

124.6.5.1 類符號引用解析

125.6.5.2 欄位符號引用解析

126.6.6 類和對象相關指令

127.6.6.1 new指令

128.6.6.2 putstatic和getstatic指令

129.6.6.3 putfield和getfield指令

130.6.6.4 instanceof和checkcast指令

131.6.6.5 ldc指令

132.6.7 測試本章代碼

133.6.8 本章小結

134.第7章 方法調用和返回

135.7.1 方法調用概述

136.7.2 解析方法符號引用

137.7.2.1 非接口方法符號引用

138.7.2.2 接口方法符號引用

139.7.3 方法調用和參數傳遞

140.7.4 返回指令

141.7.5 方法調用指令

142.7.5.1 invokestatic指令

143.7.5.2 invokespecial指令

144.7.5.3 invokevirtual指令

145.7.5.4 invokeinterface指令

146.7.6 改進解釋器

147.7.7 測試方法調用

148.7.8 類初始化

149.7.9 本章小結

150.第8章 數組和字元串

151.8.1 數組概述

152.8.2 數組實現

153.8.2.1 數組對象

154.8.2.2 數組類

155.8.2.3 載入數組類

156.8.3 數組相關指令

157.8.3.1 newarray指令

158.8.3.2 anewarray指令

159.8.3.3 arraylength指令

160.8.3.4 aload指令

161.8.3.5 astore指令

162.8.3.6 multianewarray指令

163.8.3.7 完善instanceof和checkcast指令

164.8.4 測試數組

165.8.5 字元串

166.8.5.1 字元串池

167.8.5.2 完善ldc指令

168.8.5.3 完善類載入器

169.8.6 測試字元串

170.8.7 本章小結

171.第9章 本地方法調用

172.9.1 註冊和查找本地方法

173.9.2 調用本地方法

174.9.3 反射

175.9.3.1 類和對象之間的關係

176.9.3.2 修改類載入器

177.9.3.3 基本類型的類

178.9.3.4 修改ldc指令

179.9.3.5 通過反射獲取類名

180.9.3.6 測試本節代碼

181.9.4 字元串拼接和String.intern()方法

182.9.4.1 Java類庫

183.9.4.2 System.arraycopy()方法

184.9.4.3 Float.floatToRawIntBits()和Double.doubleToRawLongBits()方法

185.9.4.4 String.intern()方法

186.9.4.5 測試本節代碼

187.9.5 Object.hashCode()、equals()和toString()

188.9.6 Object.clone()

189.9.7 自動裝箱和拆箱

190.9.8 本章小結

191.第10章 異常處理

192.10.1 異常處理概述

193.10.2 異常拋出

194.10.3 異常處理表

195.10.4 實現athrow指令

196.10.5 Java虛擬機棧信息

197.10.6 測試本章代碼

198.10.7 本章小結

199.第11章 結束

200.11.1 System類是如何被初始化的

201.11.2 初始化System類

202.11.3 System.out.println()是如何工作的

203.11.4 測試本章代碼

204.11.5 總結

205.附錄 指令表

相關詞條

熱門詞條

聯絡我們