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.附錄 指令表