【学习笔记】深入理解Java虚拟机学习笔记——第6章 类文件结构
第6章 类文件结构
6.1 概述
略
6.2 无关性的基石
1.平台无关性:可在各os的JVM重运行
2.语言无关性:无关语言,只要可以编译成.class文件,便可以在JVM上运行
6.3 class类文件的结构
.class文件也可以直接动态生成送入类加载器,并不一定需要存在文件,但动态生成的格式也是确定的。
.class中有两种数据类型
1>无符号数:U1、U2、U4、U8,表示数字、索引引用,UTF-8等。
2>表:由多个无符号数或其他表构成的复合数据类型
6.3.1 魔数与class文件的版本
.class文件开头为一个四字节的魔数,他代表着该文件为JVM可执行文件
【因为扩展名可以随意改动,所以很多很多时候使用文件开头的魔数判断文件类型】
.class文件5、6字节为次版本号,7、8字节为主版本号,JVM只能执行比自己版本低的calss文件
6.3.2 常量池
目前有17种常量,主要常量有两大类:
1>字面量:文本字符串与final常量值
2>符号引用:P218
各常量表格式“P222
6.3.3 访问标志
标识类是否为抽象类,是否为借口、是否final等,占用两字节,供16各标志位
6.3.4 类索引,父类索引与接口索引集合
类索引,父类索引用同一个U2表示,接口索引由集合表示,指向一个类描述符常量,常量中的索引值又指向全限定名字符串
6.4.5 字段表集合
1>字段访问标志:是否public、是否static、volatile等
2>简单名称与描述符
3>额外信息,如初始值指针
6.3.6 方发表集合
同上,方法字节码存放在code属性表集合中,可能添加.java中不存在的构造器方法,还有比如内部类访问外部的指针等
6.3.7 属性表集合
目前有29种属性表
P230
6.4 字节码指令简介
Java虚拟机指令由操作码及0-多个操作数构成,面向操作数栈。
6.4.1 字节码与数据类型
Java编译器会在编译/运行期间将byte、short、boolean、char转换为int类型数据,并使用int操作指令运算。
6.4.2 加载和存储指令
将数据在局部变量表和操作数栈之间来回传输
6.4.3 运算指令
数学运算、位运算、比较指令等
6.4.4 类型转换指令
小转大范围:安全转化
大转小范围:可能丢失精度
6.4.5 对象创建与访问指令
对象创建与访问字段、取数组长度、类型检查等
6.4.6 操作数栈管理指令
操作操作数栈
6.4.7 控制转移指令
条件分支指令,可修改PC寄存器的值来改变执行的语句
6.4.8 方法调用和返回指令
调用各种方法
6.4.9 异常处理指令
athrow显示抛出异常(throw语句)
6.4.10 同步指令
monitorenter与monitorexit支持synchronized关键字
6.5 公有设计,私有实现
在满足<<Java虚拟机规范>>的前提下,各组织可以自行实现JVM,并使用各种优化
6.6 class文件结构的发展
略