类文件结构
2020-06-10 10:56:01 0 举报
AI智能生成
Jvm 类文件结构
作者其他创作
大纲/内容
magic
类型:u4 数量:1
魔数
minor_version
类型:u2 数量:1
次版本号
major_version
类型:u2 数量:1
主版本号
constant_pool_count
类型:u2 数量:1
常量池常量数量
字面量(Literal)
文本字符串
声明为 final 的常量值
.......
符号引用(Symbolic References)
类和接口的全限定名
字段的名称和描述符
方法的名称和描述符
constant_pool
类型:cp_info
数量:constant_pool_count - 1
常量池
CONSTANT_Utf8_info
标志:1
描述:UTF-8 编码的字符串
结构
tag
类型:u1 值:1
length
类型:u2 数量:1
UTF-8编码的字符串占用的字节数
bytes
类型:u1 数量:length
长度为length 的 UTF-8 编码的字符串
CONSTANT_Integer_info
标志:3
描述:整型字面量
结构
tag
类型:u1 值:3
bytes
类型:u4
按照高位在前存储的 int 值
CONSTANT_Float_info
标志:4
描述:浮点型字面量
结构
tag
类型:u1
bytes
类型:u4
按照高位在前存储的 float 值
CONSTANT_Long_info
标志:5
描述:长整型字面量
结构
tag
类型:u1
bytes
类型:u8
按照高位在前存储的 long 值
CONSTANT_Double_info
标志:6
描述:双精度浮点型字面量
结构
tag
类型:u1
bytes
类型:u8
按照高位在前存储的 double 值
CONSTANT_Class_info
标志:7
描述:类或接口的符号引用
结构
tag
类型:u1 数量:1
name_index
类型:u2 数量:1
指向全限定名常量项的索引
CONSTANT_String_info
标志:8
描述:字符串类型字面量
结构
tag
类型:u1
index
类型:u2
指向字符串字面量的索引
CONSTANT_Fieldref_info
标志:9
描述:字段的符号引用
结构
tag
类型:u1
index
类型:u2
指向声明字段的类或者接口描述符 CONSTANT_Class_info 的索引项
index
类型:u2
指向字段描述符 CONSTANT_NameAndType 的索引项
CONSTANT_Methodref_info
标志:10
描述:类中方法的符号引用
结构
tag
类型:u1
index
类型:u2
指向声明方法的类描述符 CONSTANT_Class_info 的索引项
index
类型:u2
指向名称及类型描述符 CONSTANT_NameAndType 的索引项
CONSTANT_InterfaceMethodref_info
标志:11
描述:接口中方法的符号引用
结构
tag
类型:u1
index
类型:u2
指向声明方法的类描述符 CONSTANT_Class_info 的索引项
index
类型:u2
指向名称及类型描述符 CONSTANT_NameAndType 的索引项
CONSTANT_NameAndType_info
标志:12
描述:字段或方法的部分符号引用
结构
tag
类型:u1
index
类型:u2
指向该字段或方法名称常量项的索引
index
类型:u2
指向该字段或方法描述符常量项的索引
CONSTANT_MethodHandle_info
标志:15
描述:表示方法句柄
结构
tag
类型:u1
reference_kind
类型:u1
值必须在 1-9(包括1和9),它决定了方法句柄的类型。方法句柄类型的值表示方法句柄的字节码行为
reference_index
类型:u2
值必须是对常量池的有效索引
CONSTANT_MethodType_info
标志:16
描述:标识方法类型
结构
tag
类型:u1
descriptor_index
类型:u2
值必须是对常量池的有效索引,常量池在该索引处的项必须是 CONSTANT_Utf8_info 结构,表示方法的描述符
CONSTANT_InvokeDynamic_info
标志:18
描述:表示一个动态方法调用点
结构
tag
类型:u1
bootstrap_method_attr_index
类型:u2
值必须是对当前 Class 文件中引导方法表的 bootstrap_methods[] 数组的有效索引
name_and_type_index
类型:u2
值必须是对当前常量池的有效索引,常量池在该索引处的项必须是 CONSTANT_NameAndType_info 结构,表示方法名和方法描述符
access_flags
类型:u2
数量:1
访问标志
ACC_PUBLIC
0x0001
是否为 public 类型
ACC_FINAL
0x0010
是否被声明为 final, 只有类可设置
ACC_SUPER
0x0020
是否允许使用 invokespecial 字节码指令的新语意
ACC_INTERFACE
0x0200
标志这是一个接口
ACC_ABSTRACT
0x0400
是否为 abstract 类型,对于接口或者抽象类来说,此标志值为真,其它值为假
ACC_SYNTHETIC
0x1000
标识这个类并非由代码产生的
ACC_ANNOTATION
0x2000
标识这是一个注解
ACC_ENUM
0x4000
标识这是一个枚举
this_class
类型:u2
数量:1
类索引
引用两个 u2 类型的索引值表示,它们各自指向一个类型为 CONSTANT_Class_info 的类描述符常量
super_class
类型:u2
数量:1
父类索引
interfaces_count
类型:u2
数量:1
接口索引集合数量
interfaces
类型:u2
数量:interfaces_count
接口索引集合
fields_count
类型:u2
数量:1
字段表集合数量
fields
类型:field_info
数量:fields_count
字段表集合
access_flags
类型:u2
字段修饰符
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_TRANSIENT
0x0080
字段是否为 transient
ACC_SYNTHETIC
0x1000
字段是否由编译器自动产生的
ACC_ENUM
0x4000
字段是否 enum
name_index
类型:u2
字段的简单名称以及字段和方法的描述符
descriptor_index
类型:u2
字段的简单名称以及字段和方法的描述符
B:基本类型 byte
C:基本类型 char
D:基本类型 double
F:基本类型 float
I:基本类型 int
J:基本类型 long
S:基本类型 short
Z:基本类型 boolean
V:特殊类型 void
L:对象类型,如 Ljava/lang/Object
[:数组类型
attributes_count
类型:u2
attributes
类型:attribute_info 数量:attributes_count
methods_count
类型:u2
数量:1
方法表数量
methods
类型:method_info
数量:methods_count
方法表集合
access_flags
类型:u2 数量:1
方法修饰符
ACC_PUBLIC
0x0001
方法是否为 public
ACC_PRIVATE
0x0002
方法是否为 private
ACC_PROTECTED
0x0004
方法是否为 protected
ACC_STATIC
0x0008
方法是否为 static
ACC_FINAL
0x0010
方法是否为 final
ACC_SYNCHRONIZED
0x0020
方法是否为 synchronized
ACC_BRIDGE
0x0040
方法是否是由编译器产生的桥接方法
ACC_VARARGS
0x0080
方法是否接受不定参数
ACC_NATIVE
0x0100
方法是否为 native
ACC_ABSTRACT
0x0400
方法是否为 abstract
ACC_STRICTFP
0x0800
方法是否为 strictfp
ACC_SYNTHETIC
0x1000
方法是否是由编译器自动产生的
name_index
类型:u2 数量:1
descriptor_index
类型:u2 数量:1
attributes_count
类型:u2 数量:1
attributes
类型 attribute_info 数量:attributes_count
attributes_count
类型:u2
数量:1
属性表数量
attributes
类型:attribute_info
数量:attributes_count
属性表集合
Code
方法表
Java 代码编译成字节码指令
结构
attribute_name_index
类型:u2
attribute_length
类型:u4
max_stack
类型:u2
max_locals
类型:u2
code_length
类型:u4
code
类型:u1
exception_table_length
类型:u2
exception_table
类型:exception_info
attributes_count
类型:u2
attributes
类型:attribute_info
ConstantValue
字段表
final 关键字定义的常量值
结构
attribute_name_index
类型:u2
attribute_length
类型:u4
constantvalue_index
类型:u2
Deprecated
类、方法表、字段表
被声明为 deprecated 的方法和字段
结构
attribute_name_index
类型:u2
attribute_length
类型:u4
Exceptions
方法表
方法抛出的异常
结构
attribute_name_index
类型:u2
attribute_length
类型:u4
number_of_exceptions
类型:u2
exception_index_table
类型:u2
EnclosingMethod
类文件
仅当一个类为全局类或者匿名类时才能拥有这个属性,这个属性用于标识这个类所在的外围方法
InnerClasses
类文件
内部类列表
结构
attribute_name_inde
类型:u2
attribute_length
类型:u4
number_of_classes
类型:u2
inner_classes
类型:inner_classes_info
结构
inner_class_info_index
类型:u2
outer_class_info_index
类型:u2
inner_name_index
类型:u2
inner_class_access_flags
类型:u2
内部类访问标识
ACC_PUBLIC
0x0001
内部类是否为 public
ACC_PRIVATE
0x0002
内部类是否为 private
ACC_PROTECTED
0x0004
内部类是否为 protected
ACC_STATIC
0x0008
内部类是否为 static
ACC_FINAL
0x0010
内部类是否为 final
ACC_INTERFACE
0x0020
内部类是否为 synchronized
ACC_ABSTRACT
0x0400
内部类是否为 abstract
ACC_SYNTHETIC
0x1000
内部类是否是由编译器自动产生的
ACC_ANNOTATION
0x2000
内部类是否是一个注解
ACC_ENUM
0x4000
内部类是否是一个枚举
LineNumberTable
Code 属性
Java 源码的行号与字节码指令的对应关系
结构
attribute_name_index
类型:u2
attribute_length
类型:u4
line_number_table_length
类型:u2
line_number_table
类型:line_number_info
结构
start_pc
类型:u2
字节码行号
line_number
类型:u2
Java 源码行号
LocalVariableTable
Code 属性
方法的局部变量描述
结构
attribute_name_index
类型:u2
attribute_length
类型:u4
local_variable_table_length
类型:u2
local_variable_table
类型:local_variable_info
结构
start_pc
类型:u2
局部变量的生命周期开始的字节码偏移量及其作用范围覆盖的长度
length
类型:u2
局部变量的生命周期开始的字节码偏移量及其作用范围覆盖的长度
name_index
类型:u2
局部变量名称
descriptor_index
类型:u2
局部变量的描述符
index
类型:u2
局部变量在栈帧局部变量表中 Slot 的位置
StackMapTable
Code 属性
JDK 1.6 中新增的属性,供新的类型检查验证器(Type Checker)检查和处理目标方法的局部变量和操作数栈所需要的类型是否匹配
结构
attribute_name_index
类型:u2
attribute_length
类型:u4
number_of_entries
类型:u2
stack_map_frame_entries
类型:stack_map_frame
Signature
类、方法、字段表
JDK1.5 中新增属性,用于支持泛型情况下的方法签名
结构
attribute_name_index
类型:u2
attribute_length
类型:u4
signature_index
类型:u2
SourceFile
类文件
记录源文件名称
结构
attribute_name_index
类型:u2
attribute_length
类型:u4
sourcefile_index
类型:u2
SourceDebugExtension
类文件
JDK1.6 新增属性,SourceDebugExtension 属性用于存储额外的调试信息。
Synthetic
类、方法表、字段表
标识方法或字段为编译器自动生成的
结构
attribute_name_index
类型:u2
attribute_length
类型:u4
LocalVariableTypeTable
类
JDK1.5 中新增的属性,它使用特征签名代替描述符,是为了引用泛型语法之后能描述泛型参数化类型而添加
RuntimeVisibleAnnotations
类、方法表、字段表
JDK1.5 新增属性,为动态注解提供支持。RuntimeVisibleAnnotations 属性用于指明哪些注解是运行时(实际上运行时就是进行反射调用)可见的
RuntimeInvisibleAnnotations
类、方法、字段表
JDK1.5 新增属性,与RuntimeVisibleAnnotations 属性作用刚好相反,用于指明哪些注解是运行时不可见的。
RuntimeVisibleParameterAnnotations
方法表
JDK1.5 新增属性,作用与RuntimeVisibleAnnotations 属性类似,只不过作用对象为方法参数
RuntimeInvisibleParameterAnnotations
方法表
JDK1.5 中新增属性,作用与RuntimeVisibleAnnotations 属性类似,只不过作用对象为方法参数
AnnotationDefault
方法表
JDK1.5 新增属性 用于记录注解类元素的默认值
BootstrapMethods
类文件
JDK1.7 新增属性,用于保存 invokedynamic 指令引用的引导方法限定符
结构
attribute_name_index
类型:u2
attribute_length
类型:u4
num_bootstrap_methods
类型:u2
bootstrap_methods
类型:boostrap_method
结构
boostrap_method_ref
类型:u2
num_bootstrap_arguments
类型:u2
boostrap_arguments
类型:u2
结构
attribute_name_index
u2类型
attribute_length
u4 类型
info
u1 类型 数量:attribute_length
0 条评论
下一页