共计 2354 个字符,预计需要花费 6 分钟才能阅读完成。
class 字节码文件构造
类型 | 名称 | 阐明 | 长度 | 数量 |
---|---|---|---|---|
u4 | magic | 魔数, 辨认 Class 文件格式 | 4 个字节 | 1 |
u2 | minor_version | 副版本号 (小版本) | 2 个字节 | 1 |
u2 | major_version | 主版本号 (大版本) | 2 个字节 | 1 |
u2 | constant_pool_count | 常量池计数器 | 2 个字节 | 1 |
cp_info | constant_pool | 常量池表 | n 个字节 | constant_pool_count-1 |
u2 | access_flags | 拜访标识 | 2 个字节 | 1 |
u2 | this_class | 类索引 | 2 个字节 | 1 |
u2 | super_class | 父类索引 | 2 个字节 | 1 |
u2 | interfaces_count | 接口计数器 | 2 个字节 | 1 |
u2 | interfaces | 接口索引汇合 | 2 个字节 | interfaces_count |
u2 | fields_count | 字段计数器 | 2 个字节 | 1 |
field_info | fields | 字段表 | n 个字节 | fields_count |
u2 | methods_count | 办法计数器 | 2 个字节 | 1 |
method_info | methods | 办法表 | n 个字节 | methods_count |
u2 | attributes_count | 属性计数器 | 2 个字节 | 1 |
attribute_info | attributes | 属性表 | n 个字节 | attributes_count |
Class 文件版本号和平台的对应
主版本(十进制) | 副版本(十进制) | 编译器版本 |
---|---|---|
45 | 3 | 1.1 |
46 | 0 | 1.2 |
47 | 0 | 1.3 |
48 | 0 | 1.4 |
49 | 0 | 1.5 |
50 | 0 | 1.6 |
51 | 0 | 1.7 |
52 | 0 | 1.8 |
53 | 0 | 1.9 |
54 | 0 | 1.10 |
55 | 0 | 1.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_info | 1 | UTF- 8 编码的字符串 |
CONSTANT_Integer_info | 3 | 整型字面量 |
CONSTANT_Float_info | 4 | 浮点型字面量 |
CONSTANT_Long_info | 5 | 长整型字面量 |
CONSTANT_Double_info | 6 | 双精度浮点型字面量 |
CONSTANT_Class_info | 7 | 类或接口的符号援用 |
CONSTANT_String_info | 8 | 字符串类型字面量 |
CONSTANT_Fieldref_info | 9 | 字段的符号援用 |
CONSTANT_Methodref_info | 10 | 类中办法的符号援用 |
CONSTANT_InterfaceMethodref_info | 11 | 接口中办法的符号援用 |
CONSTANT_NameAndType_info | 12 | 字段或办法的符号援用 |
CONSTANT_MethodHandle_info | 15 | 示意办法句柄 |
CONSTANT_MethodType_info | 16 | 标记办法类型 |
CONSTANT_InvokeDynamic_info | 18 | 示意一个动静办法调用点 |
常量类型和构造细节
拜访标记
标记名称 | 标记值 | 含意 |
---|---|---|
ACC_PUBLIC | 0x0001 | 标记为 public 类型 |
ACC_FINAL | 0x0010 | 标记被申明为 final,只有类能够设置 |
ACC_SUPER | 0x0020 | 标记容许应用 invokespecial 字节码指令的新语义,JDK1.0.2 之后编译进去的类的这个标记默认为真。(应用加强的办法调用父类办法) |
ACC_INTERFACE | 0x0200 | 标记这是一个接口 |
ACC_ABSTRACT | 0x0400 | 是否为 abstract 类型,对于接口或者抽象类来说,次标记值为真,其余类型为假 |
ACC_SYNTHETIC | 0x1000 | 标记此类并非由用户代码产生(即:由编译器产生的类,没有源码对应) |
ACC_ANNOTATION | 0x2000 | 标记这是一个注解 |
ACC_ENUM | 0x4000 | 标记这是一个枚举 |
字段表拜访标记
标记名称 | 标记值 | 含意 |
---|---|---|
ACC_PUBLIC | 0x0001 | 字段是否为 public |
ACC_PRIVATE | 0x0002 | 字段是否为 private |
ACC_PROTECTED | 0x0004 | 字段是否为 protected |
ACC_STATIC | 0x0008 | 字段是否为 static |
ACC_FINAL | 0x0010 | 字段是否为 final |
ACC_VOLATILE | 0x0040 | 字段是否为 volatile |
ACC_TRANSTENT | 0x0080 | 字段是否为 transient |
ACC_SYNCHETIC | 0x1000 | 字段是否为由编译器主动产生 |
ACC_ENUM | 0x4000 | 字段是否为 enum |
类索引、父类索引、接口索引
长度 | 含意 |
---|---|
u2 | this_class |
u2 | super_class |
u2 | interfaces_count |
u2 | interfaces[interfaces_count] |
属性的通用格局
类型 | 名称 | 数量 | 含意 |
---|---|---|---|
u2 | attribute_name_index | 1 | 属性名索引 |
u4 | attribute_length | 1 | 属性长度 |
u1 | info | attribute_length | 属性表 |
数据类型和默认初始值对应
类型 | 默认初始值 |
---|---|
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0 |
char | u0000 |
boolean | false |
reference | null |
正文完