JVM——字节码文件

一 字节码文件的组成

字节码文件由以下几个部分组成:

  • 基本信息

  • 常量池

  • 访问标识

  • 字段

  • 方法

  • 属性

二 基本信息

魔数 Magic

软件使用文件的头几个字节来校验文件的类型,字节码文件的前4个字节为CAFEBABE

主副版本号

主副版本号指的是编译字节码文件的JDK版本号,主版本号用来标识大版本,JDK1.0-1.1使用了45.0-45.3,JDK1.2是46之后每升级一个大版本就加1。

1.2版本之后大版本号计算方法为:主版本号 - 44。例如主版本号52为JDK8。

版本号的作业主要是判断当前字节码的版本和运行时的JDK是否兼容。

image-20250220180722975

例如上图报错说明,字节码文件为JDK8,但运行时环境为JDK6。

三 常量池

包含:

  • 字面量

  • 符号引用

四 访问标志 access flags

两个字节,用来标识该Class是否为public、final、interface、abstract等等。

五 当前类、父类、接口索引集合

1
2
3
4
u2             this_class;//当前类
u2 super_class;//父类
u2 interfaces_count;//接口数量
u2 interfaces[interfaces_count];//一个类可以实现多个接口

六 字段表集合 Fields

1
2
3
4
5
6
7
8
9
10
   u2             fields_count;//字段数量
field_info fields[fields_count];//一个类会可以有个字段

field_info{
u2 access_flags;
u2 name_index;//对常量池的引用,表示的字段的名称
u2 descriptor_index;//对常量池的引用,表示字段和方法的描述符;
u2 attributes_count;一个字段还会拥有一些额外的属性
attribute_info attributes[attributes_count];
}

七 方法表集合 Methods

1
2
3
4
5
6
7
8
9
10
   u2             methods_count;//方法数量
method_info methods[methods_count];//一个类可以有个多个方法

method_info{
u2 access_flags;
u2 name_index;
u2 descriptor_index;
u2 attributes_count;
attribute_info attributes[attributes_count];
}

八 属性表集合 Attributes

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