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

41次阅读

共计 4353 个字符,预计需要花费 11 分钟才能阅读完成。

https://gitee.com/vectorx/NOT…

https://codechina.csdn.net/qq…

https://github.com/uxiahnan/N…

[toc]

Class 文件构造

## 1. 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

<hr/>

2. Class 文件数据类型

数据类型 定义 阐明
无符号数 无符号数能够用来形容数字、索引援用、数量值或依照 utf- 8 编码形成的字符串值。 其中无符号数属于根本的数据类型。以 u1、u2、u4、u8 来别离代表 1 个字节、2 个字节、4 个字节和 8 个字节
表是由多个无符号数或其余表形成的复合数据结构。 所有的表都以“_info”结尾。因为表没有固定长度,所以通常会在其后面加上个数阐明。

<hr/>

3. 魔数

<hr/>

4. 文件版本号

4.1. Class 文件版本号对应关系

主版本(十进制) 副版本(十进制) 编译器版本
4531.1
4601.2
4701.3
4801.4
4901.5
5001.6
5101.7
5201.8
5301.9
5401.10
5501.11

<hr/>

5. 常量池汇合

类型 名称 数量
u2(无符号数)constant_pool_count1
cp_info(表)constant_poolconstant_pool_count – 1

5.1. 常量池计数器

5.2. 常量池表

类型 标记 (或标识) 形容
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 示意一个动静办法调用点

标志符 含意
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_PUBLIC0x0001 标记为 public 类型
ACC_FINAL0x0010 标记被申明为 final,只有类能够设置
ACC_SUPER0x0020 标记容许应用 invokespecial 字节码指令的新语义,JDK1.0.2 之后编译进去的类的这个标记默认为真。(应用加强的办法调用父类办法)
ACC_INTERFACE0x0200 标记这是一个接口
ACC_ABSTRACT0x0400 是否为 abstract 类型,对于接口或者抽象类来说,次标记值为真,其余类型为假
ACC_SYNTHETIC0x1000 标记此类并非由用户代码产生(即:由编译器产生的类,没有源码对应)
ACC_ANNOTATION0x2000 标记这是一个注解
ACC_ENUM0x4000 标记这是一个枚举


<hr/>

7. 类索引、父类索引、接口索引

长度 含意
u2this_class
u2super_class
u2interfaces_count
u2interfaces[interfaces_count]

<hr/>

8. 字段表汇合

8.1. 字段计数器

标记名称 标记值 含意 数量
u2access_flags 拜访标记 1
u2name_index 字段名索引 1
u2descriptor_index 描述符索引 1
u2attributes_count 属性计数器 1
attribute_infoattributes 属性汇合 attributes_count

8.2. 字段表

标记名称 标记值 含意
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

标志符 含意
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. 办法表

标记名称 标记值 含意 数量
u2access_flags 拜访标记 1
u2name_index 办法名索引 1
u2descriptor_index 描述符索引 1
u2attributes_count 属性计数器 1
attribute_infoattributes 属性汇合 attributes_count

标记名称 标记值 含意
ACC_PUBLIC0x0001public,办法能够从包外拜访
ACC_PRIVATE0x0002private,办法只能本类拜访
ACC_PROTECTED0x0004protected,办法在本身和子类能够拜访
ACC_STATIC0x0008static,静态方法

<hr/>

10. 属性表汇合

10.1. 属性计数器

10.2. 属性表

类型 名称 数量 含意
u2attribute_name_index1 属性名索引
u4attribute_length1 属性长度
u1infoattribute_length 属性表

属性名称 应用地位 含意
Code 办法表 Java 代码编译成的字节码指令
ConstantValue 字段表 final 关键字定义的常量池
Deprecated 类,办法,字段表 被申明为 deprecated 的办法和字段
Exceptions 办法表 办法抛出的异样
EnclosingMethod 类文件 仅当一个类为部分类或者匿名类时能力领有这个属性,这个属性用于标识这个类所在的外围办法
InnerClass 类文件 外部类列表
LineNumberTableCode 属性 Java 源码的行号与字节码指令的对应关系
LocalVariableTableCode 属性 办法的局部变量形容
StackMapTableCode 属性 JDK1.6 中新增的属性,供新的类型查看测验器和解决指标办法的局部变量和操作数有所须要的类是否匹配
Signature 类,办法表,字段表 用于反对泛型状况下的办法签名
SourceFile 类文件 记录源文件名称
SourceDebugExtension 类文件 用于存储额定的调试信息
Synthetic 类,办法表,字段表 标记办法或字段为编译器主动生成的
LocalVariableTypeTable 是哟很惆怅特色签名代替描述符,是为了引入泛型语法之后能形容泛型参数化类型而增加
RuntimeVisibleAnnotations 类,办法表,字段表 为动静注解提供反对
RuntimeInvisibleAnnotations 类,办法表,字段表 用于指明哪些注解是运行时不可见的
RuntimeVisibleParameterAnnotation 办法表 作用与 RuntimeVisibleAnnotations 属性相似,只不过作用对象或办法
RuntimeInvisibleParameterAnnotation 办法表 作用与 RuntimeInvisibleAnnotations 属性相似,只不过作用对象或办法
AnnotationDefault 办法表 用于记录注解类元素的默认值
BootstrapMethods 类文件 用于保留 invokeddynamic 指令援用的疏导办法限定符



类型 名称 数量 含意
u2attribute_name_index1 属性名索引
u4attribute_length1 属性长度
u2max_stack1 操作数栈深度的最大值
u2max_locals1 局部变量表所需的存续空间
u4code_length1 字节码指令的长度
u1codecode_lenth 存储字节码指令
u2exception_table_length1 异样表长度
exception_infoexception_tableexception_length 异样表
u2attributes_count1 属性汇合计数器
attribute_infoattributesattributes_count 属性汇合







正文完
 0