类文件结构

代码编译的结果从本地机器码转变为宇节码,是存储格式发展的一小步,却是编程语言发展的一大步。

语言无关性

实现语言无关性的基础是虚拟机和字节码存储格式。

宇节码命令所能提供的语义描述能力比Java语言本身更加强大。

Class类文件的结构

class文件是一组以8字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容乎全部是程序运行的必要数据,没有空隙存在。

数据类型

无符号数 属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。

由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性地以“Info”结尾。表用于描述有层次关系的复合结构的数据,整个Class文件本质上就是一张表。

Class类文件的内容

  1. 魔数

OxCAFEBABE

  1. Class文件的版本

主版本号 1.7~51

次版本号

  1. 常量池

常量池中主要存放两大类常量

字面量 比较接近于Java语言层面的常量概念

符号引用 则属于编译原理方面的概念

Java代码在进行Javac编译的时候,并不像C和C++SP样有“连接”这一步骤,而是在虚拟机加载Class文件的时候进行动态连接。也就是说,在Class文件中不会保存各个方法、字段的最终内存布局信息,因此这些字段、方法的符号引用不经过运行期转换的话无法得到真正的内存人口地址,也就无法直接被虚拟机使用。当虚拟机运行时,需要从常量池获得对应的符号引用,再在类创建时或运行时解析、翻译到具体的内存地址之中。

  1. 访问标志

在常量池结束之后,紧接着的两个字节代表访问标志(access_flags),这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型:如果是类的话,是否被声明为final等。

  1. 类索引、父类索引与接口索引集合

  2. 字段表集合

接口或类中声明的变量

  1. 方法表集合

  2. 属性表集合

转载请注明:转载自srzyhead的博客(https://srzyhead.github.io)

本文链接地址: 深入理解Java虚拟机 (6-类文件结构)