作品简介

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

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

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

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

作品目录

  • 前言
  • 第1章 命令行工具
  • 1.1 准备工作
  • 1.1.1 安装JDK
  • 1.1.2 安装Go
  • 1.1.3 创建目录结构
  • 1.2 java命令
  • 1.3 编写命令行工具
  • 1.4 测试本章代码
  • 1.5 本章小结
  • 第2章 搜索class文件
  • 2.1 类路径
  • 2.2 准备工作
  • 2.3 实现类路径
  • 2.3.1 Entry接口
  • 2.3.2 DirEntry
  • 2.3.3 ZipEntry
  • 2.3.4 CompositeEntry
  • 2.3.5 WildcardEntry
  • 2.3.6 Classpath
  • 2.4 测试本章代码
  • 2.5 本章小结
  • 第3章 解析class文件
  • 3.1 class文件
  • 3.2 解析class文件
  • 3.2.1 读取数据
  • 3.2.2 整体结构
  • 3.2.3 魔数
  • 3.2.4 版本号
  • 3.2.5 类访问标志
  • 3.2.6 类和超类索引
  • 3.2.7 接口索引表
  • 3.2.8 字段和方法表
  • 3.3 解析常量池
  • 3.3.1 ConstantPool结构体
  • 3.3.2 ConstantInfo接口
  • 3.3.3 CONSTANT_Integer_info
  • 3.3.4 CONSTANT_Float_info
  • 3.3.5 CONSTANT_Long_info
  • 3.3.6 CONSTANT_Double_info
  • 3.3.7 CONSTANT_Utf8_info
  • 3.3.8 CONSTANT_String_info
  • 3.3.9 CONSTANT_Class_info
  • 3.3.10 CONSTANT_NameAndType_info
  • 3.3.11 CONSTANT_Fieldref_info、CONSTANT_Methodref_info和CONSTANT_InterfaceMethodref_info
  • 3.3.12 常量池小结
  • 3.4 解析属性表
  • 3.4.1 AttributeInfo接口
  • 3.4.2 Deprecated和Synthetic属性
  • 3.4.3 SourceFile属性
  • 3.4.4 ConstantValue属性
  • 3.4.5 Code属性
  • 3.4.6 Exceptions属性
  • 3.4.7 LineNumberTable和LocalVariableTable属性
  • 3.5 测试本章代码
  • 3.6 本章小结
  • 第4章 运行时数据区
  • 4.1 运行时数据区概述
  • 4.2 数据类型
  • 4.3 实现运行时数据区
  • 4.3.1 线程
  • 4.3.2 Java虚拟机栈
  • 4.3.3 帧
  • 4.3.4 局部变量表
  • 4.3.5 操作数栈
  • 4.3.6 局部变量表和操作数栈实例分析
  • 4.4 测试本章代码
  • 4.5 本章小结
  • 第5章 指令集和解释器
  • 5.1 字节码和指令集
  • 5.2 指令和指令解码
  • 5.2.1 Instruction接口
  • 5.2.2 BytecodeReader
  • 5.3 常量指令
  • 5.3.1 nop指令
  • 5.3.2 const系列指令
  • 5.3.3 bipush和sipush指令
  • 5.4 加载指令
  • 5.5 存储指令
  • 5.6 栈指令
  • 5.6.1 pop和pop2指令
  • 5.6.2 dup指令
  • 5.6.3 swap指令
  • 5.7 数学指令
  • 5.7.1 算术指令
  • 5.7.2 位移指令
  • 5.7.3 布尔运算指令
  • 5.7.4 iinc指令
  • 5.8 类型转换指令
  • 5.9 比较指令
  • 5.9.1 lcmp指令
  • 5.9.2 fcmp<op>和dcmp<op>指令
  • 5.9.3 if<cond>指令
  • 5.9.4 if_icmp<cond>指令
  • 5.9.5 if_acmp<cond>指令
  • 5.10 控制指令
  • 5.10.1 goto指令
  • 5.10.2 tableswitch指令
  • 5.10.3 lookupswitch指令
  • 5.11 扩展指令
  • 5.11.1 wide指令
  • 5.11.2 ifnull和ifnonnull指令
  • 5.11.3 goto_w指令
  • 5.12 解释器
  • 5.13 测试本章代码
  • 5.14 本章小结
  • 第6章 类和对象
  • 6.1 方法区
  • 6.1.1 类信息
  • 6.1.2 字段信息
  • 6.1.3 方法信息
  • 6.1.4 其他信息
  • 6.2 运行时常量池
  • 6.2.1 类符号引用
  • 6.2.2 字段符号引用
  • 6.2.3 方法符号引用
  • 6.2.4 接口方法符号引用
  • 6.3 类加载器
  • 6.3.1 readClass()
  • 6.3.2 defineClass()
  • 6.3.3 link()
  • 6.4 对象、实例变量和类变量
  • 6.5 类和字段符号引用解析
  • 6.5.1 类符号引用解析
  • 6.5.2 字段符号引用解析
  • 6.6 类和对象相关指令
  • 6.6.1 new指令
  • 6.6.2 putstatic和getstatic指令
  • 6.6.3 putfield和getfield指令
  • 6.6.4 instanceof和checkcast指令
  • 6.6.5 ldc指令
  • 6.7 测试本章代码
  • 6.8 本章小结
  • 第7章 方法调用和返回
  • 7.1 方法调用概述
  • 7.2 解析方法符号引用
  • 7.2.1 非接口方法符号引用
  • 7.2.2 接口方法符号引用
  • 7.3 方法调用和参数传递
  • 7.4 返回指令
  • 7.5 方法调用指令
  • 7.5.1 invokestatic指令
  • 7.5.2 invokespecial指令
  • 7.5.3 invokevirtual指令
  • 7.5.4 invokeinterface指令
  • 7.6 改进解释器
  • 7.7 测试方法调用
  • 7.8 类初始化
  • 7.9 本章小结
  • 第8章 数组和字符串
  • 8.1 数组概述
  • 8.2 数组实现
  • 8.2.1 数组对象
  • 8.2.2 数组类
  • 8.2.3 加载数组类
  • 8.3 数组相关指令
  • 8.3.1 newarray指令
  • 8.3.2 anewarray指令
  • 8.3.3 arraylength指令
  • 8.3.4 <t>aload指令
  • 8.3.5 <t>astore指令
  • 8.3.6 multianewarray指令
  • 8.3.7 完善instanceof和checkcast指令
  • 8.4 测试数组
  • 8.5 字符串
  • 8.5.1 字符串池
  • 8.5.2 完善ldc指令
  • 8.5.3 完善类加载器
  • 8.6 测试字符串
  • 8.7 本章小结
  • 第9章 本地方法调用
  • 9.1 注册和查找本地方法
  • 9.2 调用本地方法
  • 9.3 反射
  • 9.3.1 类和对象之间的关系
  • 9.3.2 修改类加载器
  • 9.3.3 基本类型的类
  • 9.3.4 修改ldc指令
  • 9.3.5 通过反射获取类名
  • 9.3.6 测试本节代码
  • 9.4 字符串拼接和String.intern()方法
  • 9.4.1 Java类库
  • 9.4.2 System.arraycopy()方法
  • 9.4.3 Float.floatToRawIntBits()和Double.doubleToRawLongBits()方法
  • 9.4.4 String.intern()方法
  • 9.4.5 测试本节代码
  • 9.5 Object.hashCode()、equals()和toString()
  • 9.6 Object.clone()
  • 9.7 自动装箱和拆箱
  • 9.8 本章小结
  • 第10章 异常处理
  • 10.1 异常处理概述
  • 10.2 异常抛出
  • 10.3 异常处理表
  • 10.4 实现athrow指令
  • 10.5 Java虚拟机栈信息
  • 10.6 测试本章代码
  • 10.7 本章小结
  • 第11章 结束
  • 11.1 System类是如何被初始化的
  • 11.2 初始化System类
  • 11.3 System.out.println()是如何工作的
  • 11.4 测试本章代码
  • 11.5 总结
  • 附录 指令表
展开全部