https://gitee.com/vectorx/NOT…
https://codechina.csdn.net/qq…
https://github.com/uxiahnan/N…
[toc]
Class 文件构造
## 1. 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 |
<hr/>
2. Class 文件数据类型
数据类型 | 定义 | 阐明 |
---|---|---|
无符号数 | 无符号数能够用来形容数字、索引援用、数量值或依照 utf- 8 编码形成的字符串值。 | 其中无符号数属于根本的数据类型。以 u1、u2、u4、u8 来别离代表 1 个字节、2 个字节、4 个字节和 8 个字节 |
表 | 表是由多个无符号数或其余表形成的复合数据结构。 | 所有的表都以“_info”结尾。因为表没有固定长度,所以通常会在其后面加上个数阐明。 |
<hr/>
3. 魔数
<hr/>
4. 文件版本号
4.1. 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 |
<hr/>
5. 常量池汇合
类型 | 名称 | 数量 |
---|---|---|
u2(无符号数) | constant_pool_count | 1 |
cp_info(表) | constant_pool | constant_pool_count – 1 |
5.1. 常量池计数器
5.2. 常量池表
类型 | 标记 (或标识) | 形容 |
---|---|---|
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 | 示意一个动静办法调用点 |
标志符 | 含意 |
---|---|
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 |
<hr/>
6. 拜访标记
标记名称 | 标记值 | 含意 |
---|---|---|
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 | 标记这是一个枚举 |
<hr/>
7. 类索引、父类索引、接口索引
长度 | 含意 |
---|---|
u2 | this_class |
u2 | super_class |
u2 | interfaces_count |
u2 | interfaces[interfaces_count] |
<hr/>
8. 字段表汇合
8.1. 字段计数器
标记名称 | 标记值 | 含意 | 数量 |
---|---|---|---|
u2 | access_flags | 拜访标记 | 1 |
u2 | name_index | 字段名索引 | 1 |
u2 | descriptor_index | 描述符索引 | 1 |
u2 | attributes_count | 属性计数器 | 1 |
attribute_info | attributes | 属性汇合 | attributes_count |
8.2. 字段表
标记名称 | 标记值 | 含意 |
---|---|---|
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 |
标志符 | 含意 |
---|---|
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 |
<hr/>
9. 办法表汇合
9.1. 办法计数器
9.2. 办法表
标记名称 | 标记值 | 含意 | 数量 |
---|---|---|---|
u2 | access_flags | 拜访标记 | 1 |
u2 | name_index | 办法名索引 | 1 |
u2 | descriptor_index | 描述符索引 | 1 |
u2 | attributes_count | 属性计数器 | 1 |
attribute_info | attributes | 属性汇合 | attributes_count |
标记名称 | 标记值 | 含意 |
---|---|---|
ACC_PUBLIC | 0x0001 | public,办法能够从包外拜访 |
ACC_PRIVATE | 0x0002 | private,办法只能本类拜访 |
ACC_PROTECTED | 0x0004 | protected,办法在本身和子类能够拜访 |
ACC_STATIC | 0x0008 | static,静态方法 |
<hr/>
10. 属性表汇合
10.1. 属性计数器
10.2. 属性表
类型 | 名称 | 数量 | 含意 |
---|---|---|---|
u2 | attribute_name_index | 1 | 属性名索引 |
u4 | attribute_length | 1 | 属性长度 |
u1 | info | attribute_length | 属性表 |
属性名称 | 应用地位 | 含意 |
---|---|---|
Code | 办法表 | Java 代码编译成的字节码指令 |
ConstantValue | 字段表 | final 关键字定义的常量池 |
Deprecated | 类,办法,字段表 | 被申明为 deprecated 的办法和字段 |
Exceptions | 办法表 | 办法抛出的异样 |
EnclosingMethod | 类文件 | 仅当一个类为部分类或者匿名类时能力领有这个属性,这个属性用于标识这个类所在的外围办法 |
InnerClass | 类文件 | 外部类列表 |
LineNumberTable | Code 属性 | Java 源码的行号与字节码指令的对应关系 |
LocalVariableTable | Code 属性 | 办法的局部变量形容 |
StackMapTable | Code 属性 | JDK1.6 中新增的属性,供新的类型查看测验器和解决指标办法的局部变量和操作数有所须要的类是否匹配 |
Signature | 类,办法表,字段表 | 用于反对泛型状况下的办法签名 |
SourceFile | 类文件 | 记录源文件名称 |
SourceDebugExtension | 类文件 | 用于存储额定的调试信息 |
Synthetic | 类,办法表,字段表 | 标记办法或字段为编译器主动生成的 |
LocalVariableTypeTable | 类 | 是哟很惆怅特色签名代替描述符,是为了引入泛型语法之后能形容泛型参数化类型而增加 |
RuntimeVisibleAnnotations | 类,办法表,字段表 | 为动静注解提供反对 |
RuntimeInvisibleAnnotations | 类,办法表,字段表 | 用于指明哪些注解是运行时不可见的 |
RuntimeVisibleParameterAnnotation | 办法表 | 作用与 RuntimeVisibleAnnotations 属性相似,只不过作用对象或办法 |
RuntimeInvisibleParameterAnnotation | 办法表 | 作用与 RuntimeInvisibleAnnotations 属性相似,只不过作用对象或办法 |
AnnotationDefault | 办法表 | 用于记录注解类元素的默认值 |
BootstrapMethods | 类文件 | 用于保留 invokeddynamic 指令援用的疏导办法限定符 |
类型 | 名称 | 数量 | 含意 |
---|---|---|---|
u2 | attribute_name_index | 1 | 属性名索引 |
u4 | attribute_length | 1 | 属性长度 |
u2 | max_stack | 1 | 操作数栈深度的最大值 |
u2 | max_locals | 1 | 局部变量表所需的存续空间 |
u4 | code_length | 1 | 字节码指令的长度 |
u1 | code | code_lenth | 存储字节码指令 |
u2 | exception_table_length | 1 | 异样表长度 |
exception_info | exception_table | exception_length | 异样表 |
u2 | attributes_count | 1 | 属性汇合计数器 |
attribute_info | attributes | attributes_count | 属性汇合 |