第1章 引言 1
1.1 简史 1
1.2 Java虚拟机 2
1.3 各章节摘要 2
1.4 说明 3
1.5 反馈 3
第2章 Java虚拟机结构 4
2.1 class文件格式 4
2.2 数据类型 5
2.3 原始类型与值 5
2.3.1 整数类型与整型值 6
2.3.2 浮点类型、取值集合及浮点值 6
2.3.3 returnAddress类型和值 8
2.3.4 boolean类型 8
2.4 引用类型与值 9
2.5 运行时数据区 9
2.5.1 pc寄存器 9
2.5.2 Java虚拟机栈 10
2.5.3 Java堆 10
2.5.4 方法区 11
2.5.5 运行时常量池 11
2.5.6 本地方法栈 12
2.6 栈帧 12
2.6.1 局部变量表 13
2.6.2 操作数栈 14
2.6.3 动态链接 14
2.6.4 方法调用正常完成 15
2.6.5 方法调用异常完成 15
2.7 对象的表示 15
2.8 浮点算法 15
2.8.1 Java虚拟机和IEEE 754中的浮点算法 15
2.8.2 浮点模式 16
2.8.3 数值集合转换 17
2.9 特殊方法 18
2.10 异常 19
2.11 字节码指令集简介 20
2.11.1 数据类型与Java虚拟机 21
2.11.2 加载和存储指令 23
2.11.3 算术指令 24
2.11.4 类型转换指令 25
2.11.5 对象的创建与操作 27
2.11.6 操作数栈管理指令 27
2.11.7 控制转移指令 27
2.11.8 方法调用和返回指令 28
2.11.9 抛出异常 28
2.11.10 同步 28
2.12 类库 29
2.13 公有设计、私有实现 30
第3章 Java虚拟机编译器 31
3.1 示例的格式说明 31
3.2 常量、局部变量和控制结构的使用 32
3.3 算术运算 36
3.4 访问运行时常量池 36
3.5 与控制结构有关的更多示例 37
3.6 接收参数 40
3.7 方法调用 41
3.8 使用类实例 43
3.9 数组 44
3.10 编译switch语句 46
3.11 使用操作数栈 48
3.12 抛出异常和处理异常 48
3.13 编译finally语句块 51
3.14 同步 54
3.15 注解 55
第4章 class文件格式 56
4.1 ClassFile结构 57
4.2 各种名称的内部表示形式 61
4.2.1 类和接口的二进制名称 61
4.2.2 非限定名 61
4.3 描述符 62
4.3.1 语法符号 62
4.3.2 字段描述符 62
4.3.3 方法描述符 63
4.4 常量池 64
4.4.1 CONSTANT_Class_info结构 65
4.4.2 CONSTANT_Fieldref_info、CONSTANT_Methodref_info和CONSTANT_InterfaceMethodref_info结构 66
4.4.3 CONSTANT_String_info结构 67
4.4.4 CONSTANT_Integer_info和CONSTANT_Float_info结构 67
4.4.5 CONSTANT_Long_info和CONSTANT_Double_info结构 68
4.4.6 CONSTANT_NameAnd-Type_info结构 69
4.4.7 CONSTANT_Utf8_info结构 70
4.4.8 CONSTANT_MethodHandle_info结构 72
4.4.9 CONSTANT_MethodType_info结构 73
4.4.10 CONSTANT_Invoke-Dynamic_info结构 74
4.5 字段 74
4.6 方法 76
4.7 属性 78
4.7.1 自定义和命名新的属性 82
4.7.2 Constantvalue属性 82
4.7.3 Code属性 83
4.7.4 StackMapTable属性 86
4.7.5 Exceptions属性 92
4.7.6 InnerClasses属性 93
4.7.7 EnclosingMethod属性 95
4.7.8 Synthetic属性 96
4.7.9 Signature属性 96
4.7.10 SourceFile属性 100
4.7.11 SourceDebugExtension属性 101
4.7.12 LineNumberTable属性 102
4.7.13 LocalvariableTable属性 103
4.7.14 LocalvariableTypeTable属性 104
4.7.15 Deprecated属性 106
4.7.16 RuntimevisibleAnnota-tions属性 106
4.7.17 RuntimeInvisible-Annotations属性 110
4.7.18 RuntimevisibleParameter Annotations属性 111
4.7.19 RuntimeInvisiblePara-meterAnnotations属性 112
4.7.20 RuntimevisibleTypeAnnotations属性 114
4.7.21 RuntimeInvisibleType-Annotations属性 124
4.7.22 AnnotationDefault属性 125
4.7.23 BootstrapMethods属性 126
4.7.24 MethodParameters属性 127
4.8 格式检查 129
4.9 Java虚拟机代码约束 129
4.9.1 静态约束 130
4.9.2 结构化约束 132
4.10 class文件校验 135
4.10.1 类型检查验证 136
4.10.2 类型推导验证 200
4.11 Java虚拟机限制 206
第5章 加载、链接与初始化 208
5.1 运行时常量池 208
5.2 虚拟机启动 210
5.3 创建和加载 211
5.3.1 使用引导类加载器来加载类型 212
5.3.2 使用用户自定义类加载器来加载类型 212
5.3.3 创建数组类 213
5.3.4 加载限制 214
5.3.5 从class文件表示得到类 214
5.4 链接 215
5.4.1 验证 216
5.4.2 准备 216
5.4.3 解析 217
5.4.4 访问控制 225
5.4.5 方法覆盖 225
5.5 初始化 226
5.6 绑定本地方法实现 228
5.7 Java虚拟机退出 228
第6章 Java虚拟机指令集 229
6.1 设定:“必须”的含义 229
6.2 保留操作码 229
6.3 虚拟机错误 230
6.4 指令描述格式 230
6.5 指令集描述 232
第7章 操作码助记符 320
附录A Limited License Grant 327