一.类文件结构
1.概述
各种不同的平台的虚拟机与所有平台都统一使用的程序存储格式 — 字节码是实现平台无关性的基石
所以我们有必要要了解class文件的文件结构是怎样的。
2.Class文件结构
class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在class文件之中,中间没有添加任何间隔符,这使得整个class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在,当遇到需要占用8位字节以上空间的数据项时,则会按照高为在前的方式分割成若干个8位字节存储。
每个class文件的结构如下:
1.魔数(magic)
- 位置:class文件的头4个字节
- 作用:确定该class文件是否是一个能被虚拟机接受的class文件。
- java的魔数:0xCAFEBABE
2.版本信息
- 位置:紧接着魔数的4个字节
- 分类:minor_version(次版本号),major_version(主版本号)
- 作用:确定class文件的版本格式,不同版本的jdk支持的class文件的版本格式可能会不同
3.常量池
- 位置:紧接着版本信息
- 特点:class文件的资源仓库,占用class文件空间最大的数据项目之一,与其他数据项目关联最多的数据类 型,第一个出现的表类型的数据项目。
- 组成:
4.访问标志
- 位置:紧接着常量池的2个字节
- 作用:识别类或者接口的层次的访问信息,包括:这个class是类还是接口,访问修饰符是哪个,是否抽象等等
5.字段表集合
- 作用:描述接口或者类中声明的变量,包括类级变量以及实例级变量,不包括局部变量
二.字节码指令
字节码和数据类型
l:long,s:short,b:byte,f:float,d:double,a:类型
但是从表中可以看出,大部分指令都没有支持byte,short,char和boolean,编译器会在编译器或运行期将byte,short类型的数据带符号扩展为int类型数据,boolean和char则按零位扩展成int类型数据,所以大多数对于byte,short,char和boolean的操作都是基于int