深入理解java虚拟机第二版类文件结构

Posted 夜未眠shm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解java虚拟机第二版类文件结构相关的知识,希望对你有一定的参考价值。

一.class类文件的结构

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

根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表。

  • 无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。
  • 是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性地以“_info”结尾。表用于描述有层次关系的复合结构的数据

 

 

class类文件结构:

 

1.魔数(Magic Number)

每个Class文件的头4个字节称为魔数(Magic Number),它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件。值为:0xCAFEBABE(咖啡宝贝)

2.Class文件的版本号

第5和第6个字节是次版本号(Minor Version),第7和第8个字节是主版本号(Major Version)

 

 

 

 

 3.常量池

 

 使用Javap命令输出常量表:

C:\\>javap-verbose TestClass

 

 

 

 

4.访问标志

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

 

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

类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,而接口索引集合(interfaces)是一组u2类型的数据的集合,Class文件中由这三项数据来确定这个类的继承关系。类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名。

 

6.字段表集合

字段表(field_info)用于描述接口或者类中声明的变量。字段(field)包括类级变量以及实例级变量,但不包括在方法内部声明的局部变量。

 

 6.1 字段修饰符

字段修饰符放在access_flags项目中,它与类中的access_flags项目是非常类似的,都是一个u2的数据类型

 

 6.2 字段的简单名称和方法的描述符

跟随access_flags标志的是两项索引值:name_index和descriptor_index。它们都是对常量池的引用,分别代表着字段的简单名称以及字段和方法的描述符。

 

 

7.方法表集合

 

 

 

 8.属性表集合

属性表(attribute_info)在Class文件、字段表、方法表都可以携带自己的属性表集合,以用于描述某些场景专有的信息

 

 

 

 二.字节码指令简介

Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。

 

 

以上是关于深入理解java虚拟机第二版类文件结构的主要内容,如果未能解决你的问题,请参考以下文章

深入理解JAVA虚拟机第三部分.虚拟机执行子系统.1.类文件结构

深入理解Java虚拟机的目录

精选资源深入理解Java虚拟机(第二版).pdf

JAVA实现代码热更新

JAVA实现代码热更新

JAVA实现代码热更新