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