关于java:JVM学习Class字节码文件结构

37次阅读

共计 2354 个字符,预计需要花费 6 分钟才能阅读完成。

class 字节码文件构造

类型 名称 阐明 长度 数量
u4magic 魔数, 辨认 Class 文件格式 4 个字节 1
u2minor_version 副版本号 (小版本) 2 个字节 1
u2major_version 主版本号 (大版本) 2 个字节 1
u2constant_pool_count 常量池计数器 2 个字节 1
cp_infoconstant_pool 常量池表 n 个字节 constant_pool_count-1
u2access_flags 拜访标识 2 个字节 1
u2this_class 类索引 2 个字节 1
u2super_class 父类索引 2 个字节 1
u2interfaces_count 接口计数器 2 个字节 1
u2interfaces 接口索引汇合 2 个字节 interfaces_count
u2fields_count 字段计数器 2 个字节 1
field_infofields 字段表 n 个字节 fields_count
u2methods_count 办法计数器 2 个字节 1
method_infomethods 办法表 n 个字节 methods_count
u2attributes_count 属性计数器 2 个字节 1
attribute_infoattributes 属性表 n 个字节 attributes_count

Class 文件版本号和平台的对应

主版本(十进制) 副版本(十进制) 编译器版本
4531.1
4601.2
4701.3
4801.4
4901.5
5001.6
5101.7
5201.8
5301.9
5401.10
5501.11

class 文件数据类型

数据类型 定义 阐明
无符号数 无符号数能够用来形容数字、索引援用、数量值或依照 utf- 8 编码形成的字符串值。 其中无符号数属于根本的数据类型。以 u1、u2、u4、u8 来别离代表 1 个字节、2 个字节、4 个字节和 8 个字节
表是由多个无符号数或其余表形成的复合数据结构。 所有的表都以“_info”结尾。因为表没有固定长度,所以通常会在其后面加上个数阐明。

类型描述符

标志符 含意
B 根本数据类型 byte
C 根本数据类型 char
D 根本数据类型 double
F 根本数据类型 float
I 根本数据类型 int
J 根本数据类型 long
S 根本数据类型 short
Z 根本数据类型 boolean
V 代表 void 类型
L 对象类型,比方:Ljava/lang/Object;
[ 数组类型,代表一维数组。比方:double[][][] is [[[D

常量类型和构造

类型 标记 (或标识) 形容
CONSTANT_utf8_info1UTF- 8 编码的字符串
CONSTANT_Integer_info3 整型字面量
CONSTANT_Float_info4 浮点型字面量
CONSTANT_Long_info5 长整型字面量
CONSTANT_Double_info6 双精度浮点型字面量
CONSTANT_Class_info7 类或接口的符号援用
CONSTANT_String_info8 字符串类型字面量
CONSTANT_Fieldref_info9 字段的符号援用
CONSTANT_Methodref_info10 类中办法的符号援用
CONSTANT_InterfaceMethodref_info11 接口中办法的符号援用
CONSTANT_NameAndType_info12 字段或办法的符号援用
CONSTANT_MethodHandle_info15 示意办法句柄
CONSTANT_MethodType_info16 标记办法类型
CONSTANT_InvokeDynamic_info18 示意一个动静办法调用点

常量类型和构造细节

拜访标记

标记名称 标记值 含意
ACC_PUBLIC0x0001 标记为 public 类型
ACC_FINAL0x0010 标记被申明为 final,只有类能够设置
ACC_SUPER0x0020 标记容许应用 invokespecial 字节码指令的新语义,JDK1.0.2 之后编译进去的类的这个标记默认为真。(应用加强的办法调用父类办法)
ACC_INTERFACE0x0200 标记这是一个接口
ACC_ABSTRACT0x0400 是否为 abstract 类型,对于接口或者抽象类来说,次标记值为真,其余类型为假
ACC_SYNTHETIC0x1000 标记此类并非由用户代码产生(即:由编译器产生的类,没有源码对应)
ACC_ANNOTATION0x2000 标记这是一个注解
ACC_ENUM0x4000 标记这是一个枚举

字段表拜访标记

标记名称 标记值 含意
ACC_PUBLIC0x0001 字段是否为 public
ACC_PRIVATE0x0002 字段是否为 private
ACC_PROTECTED0x0004 字段是否为 protected
ACC_STATIC0x0008 字段是否为 static
ACC_FINAL0x0010 字段是否为 final
ACC_VOLATILE0x0040 字段是否为 volatile
ACC_TRANSTENT0x0080 字段是否为 transient
ACC_SYNCHETIC0x1000 字段是否为由编译器主动产生
ACC_ENUM0x4000 字段是否为 enum

类索引、父类索引、接口索引

长度 含意
u2this_class
u2super_class
u2interfaces_count
u2interfaces[interfaces_count]

属性的通用格局

类型 名称 数量 含意
u2attribute_name_index1 属性名索引
u4attribute_length1 属性长度
u1infoattribute_length 属性表

数据类型和默认初始值对应

类型 默认初始值
byte(byte)0
short(short)0
int0
long0L
float0.0f
double0.0
charu0000
booleanfalse
referencenull
正文完
 0