书刊介绍
《自己动手写Java虚拟机》内容简介
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和dcmp指令
5.9.3、if指令
5.9.4、if_icmp指令
5.9.5、if_acmp指令
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、aload指令
8.3.5、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、总结
附录
指令表