0%

字节码文件

字节码文件

字节码文件中包含的内容有包含类的版本信息、字段、方法以及接口等描述信息外,还有常量池表(Constant Pool Table),包括各种字面量和对类型、域(Field)和方法的符号引用,指令代码行号表等信息

  • java栈中:局部变量表、操作数栈
  • java堆中
  • 常量池
  • 帧数据区、方法区的剩余情况

文件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ClassFile {
u4 magic;// 魔数,识别class文件格式 cafe babe
u2 minor_version; // 副版本号
u2 major_version; // 主版本号
u2 constant_pool_count; //常量池计数器,计数从1开始,记录常量池表中的数量,减一等于常量池表的长度
cp_info constant_pool[constant_pool_count-1]; //常量池表,用于存放编译时期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放
u2 access_flags; // 访问标识
u2 this_class; // 类索引
u2 super_class; // 父类索引
u2 interfaces_count; // 接口计数器
u2 interfaces[interfaces_count]; // 接口索引集合
u2 fields_count; // 字段计数器
field_info fields[fields_count]; // 字段表
u2 methods_count; // 方法计数器
method_info methods[methods_count]; // 方法表
u2 attributes_count; // 属性计数器
attribute_info attributes[attributes_count]; //属性表
}

魔数

魔数是用来识别class文件格式,java的class文件中都是 cafe babe

副版本号

主版本号

常量池

常量池分为常量池计数器和常量池表

常量池计数器

计数从1开始,记录常量池表中的数量,减一等于常量池表的长度

常量池表

常量池表中主要存放字面量符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放

字面量主要是*文本字符串**声明为final的常量值***

符号引用主要是类和接口的全限定名,字段的名称和描述符,方法的名称和描述符

FieldType term Type
B byte
C char
D double
F float
I int
J long
L ClassName ; 对象reference`
S short
Z boolean
[ 数组reference
常量类型 标志值 描述
CONSTANT_Class 7 类或接口的符号引用
CONSTANT_Fieldref 9 字段的符号引用
CONSTANT_Methodref 10 类中方法的符号引用
CONSTANT_InterfaceMethodref 11 接口中方法的符号引用
CONSTANT_String 8 字符串类型字面量
CONSTANT_Integer 3 整型字面量
CONSTANT_Float 4 浮点型字面量
CONSTANT_Long 5 长整型字面量
CONSTANT_Double 6 双精度浮点型字面量
CONSTANT_NameAndType 12 字段或方法的符号引用
CONSTANT_Utf8 1 UTF-8编码的字符串
CONSTANT_MethodHandle 15 犯法句柄
CONSTANT_MethodType 16 标志方法类型
CONSTANT_InvokeDynamic 18 动态方法调用点

访问标识

标识名称 含义
ACC_PUBLIC 0x0001 标识为public,可以被包外访问
ACC_FINAL 0x0010 标识被声明为final,不允许有子类
ACC_SUPER 0x0020 表示允许使用invokespecial字节码指令来调用父类的方法
ACC_INTERFACE 0x0200 标识这是一个接口
ACC_ABSTRACT 0x0400 声明为abstract,不能直接被实例化
ACC_SYNTHETIC 0x1000 表示是由编译器产生的类,没有对应的源码
ACC_ANNOTATION 0x2000 声明为annotation类型,注解
ACC_ENUM 0x4000 声明为enum类型,枚举

字段表集合

字段计数器和字段表

字段包括**类变量以及实例变量**,不包括方法内部、代码块内部声明的局部变量,也不会列出从父类或者实现的接口中继承来的字段

字段的名称、类型是引用的常量池中的常量来进行描述的,常量池中描述了每个字段的完整信息,包括字段标识符、访问修饰符、static修饰、final修饰等

方法表集合

方法表中存储的是一个一个的method_info,method_info结构可以表示类和接口中定义的所有方法,包括实例方法、类方法、实例初始化方法和类或接口初始化方法

属性表集合

记录的是class文件所携带的辅助信息,如class文件的源文件名称,以及带有RetentionPolicy.CLASS或RetentionPolicy.RUNTIME的注解