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