class字节码文件结构
class字节码文件结构
类型 |
名称 |
说明 |
长度 |
数量 |
u4 |
magic |
魔数,识别Class文件格式 |
4个字节 |
1 |
u2 |
minor_version |
副版本号(小版本) |
2个字节 |
1 |
u2 |
major_version |
主版本号(大版本) |
2个字节 |
1 |
u2 |
constant_pool_count |
常量池计数器 |
2个字节 |
1 |
cp_info |
constant_pool |
常量池表 |
n个字节 |
constant_pool_count-1 |
u2 |
access_flags |
访问标识 |
2个字节 |
1 |
u2 |
this_class |
类索引 |
2个字节 |
1 |
u2 |
super_class |
父类索引 |
2个字节 |
1 |
u2 |
interfaces_count |
接口计数器 |
2个字节 |
1 |
u2 |
interfaces |
接口索引集合 |
2个字节 |
interfaces_count |
u2 |
fields_count |
字段计数器 |
2个字节 |
1 |
field_info |
fields |
字段表 |
n个字节 |
fields_count |
u2 |
methods_count |
方法计数器 |
2个字节 |
1 |
method_info |
methods |
方法表 |
n个字节 |
methods_count |
u2 |
attributes_count |
属性计数器 |
2个字节 |
1 |
attribute_info |
attributes |
属性表 |
n个字节 |
attributes_count |
Class文件版本号和平台的对应
主版本(十进制) |
副版本(十进制) |
编译器版本 |
45 |
3 |
1.1 |
46 |
0 |
1.2 |
47 |
0 |
1.3 |
48 |
0 |
1.4 |
49 |
0 |
1.5 |
50 |
0 |
1.6 |
51 |
0 |
1.7 |
52 |
0 |
1.8 |
53 |
0 |
1.9 |
54 |
0 |
1.10 |
55 |
0 |
1.11 |
class文件数据类型
数据类型 |
定义 |
说明 |
无符号数 |
无符号数可以用来描述数字、索引引用、数量值或按照utf-8编码构成的字符串值。 |
其中无符号数属于基本的数据类型。 以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节 |
表 |
表是由多个无符号数或其他表构成的复合数据结构。 |
所有的表都以“_info”结尾。 由于表没有固定长度,所以通常会在其前面加上个数说明。 |
类型描述符
标志符 |
含义 |
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 |
常量类型和结构
类型 |
标志(或标识) |
描述 |
CONSTANT_utf8_info |
1 |
UTF-8编码的字符串 |
CONSTANT_Integer_info |
3 |
整型字面量 |
CONSTANT_Float_info |
4 |
浮点型字面量 |
CONSTANT_Long_info |
5 |
长整型字面量 |
CONSTANT_Double_info |
6 |
双精度浮点型字面量 |
CONSTANT_Class_info |
7 |
类或接口的符号引用 |
CONSTANT_String_info |
8 |
字符串类型字面量 |
CONSTANT_Fieldref_info |
9 |
字段的符号引用 |
CONSTANT_Methodref_info |
10 |
类中方法的符号引用 |
CONSTANT_InterfaceMethodref_info |
11 |
接口中方法的符号引用 |
CONSTANT_NameAndType_info |
12 |
字段或方法的符号引用 |
CONSTANT_MethodHandle_info |
15 |
表示方法句柄 |
CONSTANT_MethodType_info |
16 |
标志方法类型 |
CONSTANT_InvokeDynamic_info |
18 |
表示一个动态方法调用点 |
常量类型和结构细节
创新互联主营黑山网站建设的网络公司,主营网站建设方案,app软件开发公司,黑山h5微信小程序开发搭建,黑山网站营销推广欢迎黑山等地区企业咨询
访问标志
标志名称 |
标志值 |
含义 |
ACC_PUBLIC |
0x0001 |
标志为public类型 |
ACC_FINAL |
0x0010 |
标志被声明为final,只有类可以设置 |
ACC_SUPER |
0x0020 |
标志允许使用invokespecial字节码指令的新语义,JDK1.0.2之后编译出来的类的这个标志默认为真。(使用增强的方法调用父类方法) |
ACC_INTERFACE |
0x0200 |
标志这是一个接口 |
ACC_ABSTRACT |
0x0400 |
是否为abstract类型,对于接口或者抽象类来说,次标志值为真,其他类型为假 |
ACC_SYNTHETIC |
0x1000 |
标志此类并非由用户代码产生(即:由编译器产生的类,没有源码对应) |
ACC_ANNOTATION |
0x2000 |
标志这是一个注解 |
ACC_ENUM |
0x4000 |
标志这是一个枚举 |
字段表访问标志
标志名称 |
标志值 |
含义 |
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_TRANSTENT |
0x0080 |
字段是否为transient |
ACC_SYNCHETIC |
0x1000 |
字段是否为由编译器自动产生 |
ACC_ENUM |
0x4000 |
字段是否为enum |
类索引、父类索引、接口索引
长度 |
含义 |
u2 |
this_class |
u2 |
super_class |
u2 |
interfaces_count |
u2 |
interfaces[interfaces_count] |
属性的通用格式
类型 |
名称 |
数量 |
含义 |
u2 |
attribute_name_index |
1 |
属性名索引 |
u4 |
attribute_length |
1 |
属性长度 |
u1 |
info |
attribute_length |
属性表 |
数据类型和默认初始值对应
类型 |
默认初始值 |
byte |
(byte)0 |
short |
(short)0 |
int |
0 |
long |
0L |
float |
0.0f |
double |
0.0 |
char |
\u0000 |
boolean |
false |
reference |
null |
网站标题:class字节码文件结构
URL标题:
http://ybzwz.com/article/dsdihjj.html