微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

目录
  • Class文件结构
    • 10.1. 属性计数器
    • 10.2. 属性
    • 9.1. 方法计数器
    • 9.2. 方法
    • 8.1. 字段计数器
    • 8.2. 字段表
    • 5.1. 常量池计数器
    • 5.2. 常量池表
    • 4.1. Class文件版本号对应关系
    • 1. Class字节码文件结构
    • 2. Class文件数据类型
    • 3. 魔数
    • 4. 文件版本号
    • 5. 常量池集合
    • 6. 访问标志
    • 7. 类索引、父类索引、接口索引
    • 8. 字段表集合
    • 9. 方法表集合
    • 10. 属性表集合


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

2. Class文件数据类型

数据类型定义说明
无符号数无符号数可以用来描述数字、索引引用、数量值或按照utf-8编码构成的字符串值。其中无符号数属于基本的数据类型。 以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节
表是由多个无符号数或其他表构成的复合数据结构。所有的表都以“_info”结尾。 由于表没有固定长度,所以通常会在其前面加上个数说明。

3. 魔数


4. 文件版本号

image-20210421224555413

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

eff35d2a-a2b3-44f9-a625-0462bf0057f7


5. 常量池集合

3fbabd86-ef93-4155-8897-5ba80df00d4e

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

image-20210421224936271

5.1. 常量池计数器

84ce6f3d-fbf0-4490-842a-856f965a5429

5.2. 常量池表

f8a9cc2b-634e-4d54-a4cb-e4602aefd563

类型标志(或标识)描述
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

3


1


1598773300484


1598773308492


2


3


4


5


6. 访问标志

image-20210421231021187

标志名称标志值含义
ACC_PUBLIC0x0001标志为public类
ACC_FINAL0x0010标志被声明为final,只有类可以设置
ACC_SUPER0x0020标志允许使用invokespecial字节码指令的新语义,JDK1.0.2之后编译出来的类的这个标志认为真。(使用增强的方法调用父类方法
ACC_INTERFACE0x0200标志这是一个接口
ACC_ABSTRACT0x0400是否为abstract类型,对于接口或者抽象类来说,次标志值为真,其他类型为假
ACC_SYNTHETIC0x1000标志此类并非由用户代码产生(即:由编译器产生的类,没有源码对应)
ACC_ANNOTATION0x2000标志这是一个注解
ACC_ENUM0x4000标志这是一个枚举

image-20210421231147766


977b4d77-dc03-4830-a9c5-0069bab1a384


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

image-20210421231334723

长度含义
u2this_class
u2super_class
u2interfaces_count
u2interfaces[interfaces_count]

image-20210421231349548

87f8abb1-afbf-42af-81af-78aab7c33592


8. 字段表集合

8.1. 字段计数器

070b51a7-d6e9-4ff8-a83e-5673d0847bc8

标志名称标志值含义数量
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

image-20210421223758811

标志符含义
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


9. 方法表集合

image-20210421231944717

9.1. 方法计数器

image-20210421232013521

9.2. 方法

image-20210421232329507

标志名称标志值含义数量
u2access_flags访问标志1
u2name_index方法名索引1
u2descriptor_index描述符索引1
u2attributes_count属性计数器1
attribute_infoattributes属性集合attributes_count

image-20210421232534333

标志名称标志值含义
ACC_PUBLIC0x0001public,方法可以从包外访问
ACC_PRIVATE0x0002private,方法只能本类访问
ACC_PROTECTED0x0004protected,方法在自身和子类可以访问
ACC_STATIC0x0008static,静态方法

10. 属性表集合

image-20210421232830757

10.1. 属性计数器

image-20210421232859617

10.2. 属性

image-20210421233604854

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

image-20210421233732774

属性名称使用位置含义
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指令引用的引导方法限定符

image-20210421235232911


5


image-20210421235308491

类型名称数量含义
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属性集合

image-20210421235327031


7


8


9


10


11



版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐