自己动手写Java虚拟机

自己动手写Java虚拟机

暂无评价综合评分的显示会考虑用户真实性等多项因素,每部作品出现综合评分的时间不定。
8.3117 评价豆瓣读书

作品简介

Java虚拟机非常复杂,要想真正理解它的工作原理,最好的方式就是自己动手编写一个!

本书是继《深入理解Java虚拟机》之后的又一经典著作,它一方面遵循《Java虚拟机规范》,一方面又独辟蹊径,不仅能让Java虚拟机的学习变得更加简单和有趣,而且能让你对Java虚拟机的原理认识更深入和更深刻!

本书摒弃了传统的以解读枯燥的Java虚拟机规范文档和分析繁琐的Java虚拟机源代码的方式来讲解Java虚拟机,取而代之的是,以实践的方式,引导读者如何从零开始构建和实现一个Java虚拟机,整个过程不仅能让读者做到对Java虚拟机知其然而且知其所以然,还能屏蔽大量不必要的繁琐细节,体会到实现过程中的成就感,让学习过程更加轻松、愉悦和高效。更重要的是,这种方式能引导读者更深入地认识和掌握Java虚拟机的工作原理。

张秀宏,资深Java服务器开发工程师,有多年的Java开发、游戏服务器开发和架构经验,对Java虚拟机有非常深入的研究。曾在EA、华娱无线等游戏公司担任高级服务器工程师职位,现任乐元素Lead软件工程师。

作品目录

  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<op>和dcmp<op>指令
  93. 5.9.3 if<cond>指令
  94. 5.9.4 if_icmp<cond>指令
  95. 5.9.5 if_acmp<cond>指令
  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 <t>aload指令
  161. 8.3.5 <t>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. 附录 指令表
载入中

大家都喜欢