乐趣区

关于javascript:<JVM中篇字节码与类的加载篇>01Class字节码文件结构

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 属性汇合







退出移动版