根据JVM的规范,类文件的结构如下:
类型 | 名称 | 解释 |
---|---|---|
u4 | magic | 魔数 |
u2 | minor_version | 小版本号 |
u2 | major_version | 主版本号 |
u2 | constant_pool_count | 常量池长度 |
cp_info | constant_pool[constant_pool_count - 1] | 常量池信息 |
u2 | access_flags | 访问修饰 |
u2 | this_class | 当前类信息 |
u2 | super_class | 父类信息 |
u2 | interfaces_count | 接口长度 |
u2 | interfaces[interfaces_count] | 接口信息 |
u2 | fields_count | 类中成员变量长度 |
field_info | fields[fields_count] | 成员变量信息 |
u2 | methods_counts | 方法长度 |
method_info | methods[methods_count] | 方法信息 |
u2 | attributes_count | 附加属性长度 |
attribute_info | attributes[attributes_count] | 附加属性信息 |
占4个字节。用来表示这是一个java文件,java的魔数是ca fe be be
各占2个字节,共4个字节。用来表示类的版本,例如 00 00 00 34 ,其中 00 34 就表示是java8
占2个字节,位置在8~9字节。用来表示常量池长度,例如 00 23 表示常量池有2*16+3-1 = 34项,其中#0项不计入其中,也没有值。
值 | 类型 |
---|---|
01 | CONSTANT_Utf8 |
03 | CONSTANT_Integer |
04 | CONSTANT_Float |
05 | CONSTANT_Long |
06 | CONSTANT_Double |
07 | CONSTANT_Class |
08 | CONSTANT_String |
09 | CONSTANT_Fieldref |
0a | CONSTANT_Methodref |
0b | CONSTANT_InterfaceMethofref |
0c | CONSTANT_NameAndType |
of | CONSTANT_MethodHandle |
10 | CONSTANT_MethodType |
12 | CONSTANT_InvokeDynamic |
占用2个字节。表示方法的个数
方法信息。一般有构造方法init 和 主函数main。
值 | 类型 |
---|---|
0x0001 | ACC_PUBLIC |
0x0010 | ACC_FINAL |
0x0020 | ACC_SUPER |
0x0200 | ACC_INTERFACE |
0x0400 | ACC_ABSTRACT |
0x1000 | ACC_SYNTHETIC |
0x2000 | ACC_ANNOTATION |
0x4000 | ACC_ENUM |
Type | FieldType |
---|---|
byte | B |
char | C |
double | D |
float | F |
int | I |
long | J |
reference | L ClassName;(引用类型) |
short | S |
boolean | Z |
reference | [(一维数组) |
==================== 参 考 文 献 ====================