Class文件
2020-08-07 17:47:15 1 举报
AI智能生成
jvm class文件格式
作者其他创作
大纲/内容
magic_number
minor_version
major_version
constant_pool_count
1 CONSTANT_Utf8_info
tag: 1 -- (tag 占用空间1字节)
length: UTF-8字符串占用的字节数
bytes: 长度位 length 的字符串
3 CONSTANT_Integer_info
tag: 3
bytes: 4个字节, Big-Endian (高位在前) 存储的 int 值
4 CONSTANT_Float_info
tag: 4
4个字节 Big-Endian 的 float 值
5 CONSTANT_Long_info
tag: 5
8个字节 Big-Endian 的 long 值
6 CONSTANT_Double_info
tag: 6
6个字节 Big-Endian 的 double 值
7 CONSTANT_Class_info
tag: 7
index:2字节 指向类的全限定名项的索引
8 CONSTANT_String_info
tag: 8
2个字节 指向字符串字面量的索引
9 CONSTANT_Fieldref_info
tag: 9
index: 2字节 指向声明字段的类或者接口描述符 CONSTANT_Class_info 的索引项
10 CONSTANT_Methodref_info
tag: 10
index: 2字节 指向声明方法的类或者接口描述符 CONSTANT_Class_info 的索引项
index: 2字节 指向字段描述符 CONSTANT_NameAndType 的索引项
11 CONSTANT_InterfaceMethodref_info
tag: 11
index: 2字节 指向声明方法的类或者接口描述符 CONSTANT_Class_info 的索引项
index: 2字节 指向字段描述符 CONSTANT_NameAndType 的索引项
12 CONSTANT_NameAndType_info
tag: 12
index: 2字节 指向该字段或方法名称常量项的索引
index: 2字节 指向该字段或方法描述符常量项的索引
15 CONSTANT_MethodHandle_info
tag: 15
reference_kind: 1字节 1-9 之间的一个值, 决定了方法句柄的类型。方法句柄类型的值表示方法句柄的字节码行为。
reference_index: 2字节 对常量池的有效索引
16 CONSTANT_MethodType_info
tag: 16
descriptor_index: 2字节 指向 Utf8_info 结构表示的方法描述符
18 CONSTANT_InvokeDynamic_info
tag: 18
bootstrap_method_attr_index: 2字节 当前 Class 文件中引导方法表的 bootstrap_methods[] 数组的有效索引
name_and_type_index: 2 字节 指向 NameAndType_info 表示的方法名和方法描述符
access_flags
ACC_PUBLIC 0x0001 是否为 public 类型
ACC_FINAL 0x0010 是否为 final 类型
ACC_SUPER 0x0020 该标志必须为真, JDK 1.0.2 编译出来的内容 指明 invokespectial 指令使用新语义
ACC_INTERFACE 0x0200 是否是接口
ACC_ABSTRACT 0x0400 接口或抽象类
ACC_SYNTHEIC 0x1000 编译器自动生成, 非用户代码产生
ACC_ANNOTATION 0x2000
ACC_ENUM 0x4000
this_class
super_class
interfaces_count
interfaces
fields_count
fields
access_flags -u2
ACC_PUBLIC - 0x0001
ACC_PRIVATE - 0x0002
ACC_PROTECTED - 0x0004
ACC_STATIC - 0x0008
ACC_FINAL - 0x0010
ACC_VOLATILE - 0x0040
ACC_TRANSIENT - 0x0080
ACC_SYNTHETIC - 0x1000
ACC_ENUM - 0x4000
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 - Object (Lcom/test/User)
数组
一维数组 [B
多维数组 [[C [[[Ljava/lang/String
attributes_count
attributes
methods_count
method
access_flags 2字节
ACC_PUBLIC - 0x0001
ACC_PRIVATE - 0x0002
ACC_PROTECTED - 0x0004
ACC_STATIC - 0x0008
ACC_FINAL - 0x0010
ACC_SYNCHRONIZED - 0x0020
ACC_BRIDGE - 0x0040
编译器产生的桥接方法
ACC_VARARGS - 0x0080
ACC_NATIVE - 0x0100
ACC_ABSTRACT - 0x0400
ACC_STRICTFP - 0x8000
ACC_SYNTHETIC - 0x1000
name_index - u2
descriptor_index - u2
先参数列表, 放在括号内部, 后返回值
void m() -> ()V
String toString() -> ()Ljava/lang/String;
long pos(int [] arr1, int arr[]2, long length) -> ([I[IJ)J
attributes_count - u2
attributes
既有预定义属性,也可以自定义。java 虚拟机自动忽略不认识的属性
Code - 方法表 - 该方法编译成的字节码指令
u2 - attribute_name_index
u4 - attribute_length
u2 - max_stack
u2 - max_locals
u4 - code_length
code
u2 - exception_table_length
exception_table
u2 - attribute_count
attributes
ConstantValue - 字段表 - final 关键字定义的常量值
Deprecated - 类、方法表、字段表
Exceptios - 方法表
EnclosingMethod - 类文件 - 局部类或匿名类的
0 条评论
下一页