通过 javac 类名.java 编译 java 文件后,会生成一个 .class 的文件!
0000000 ca fe ba be 00 00 00 34 00 23 0a 00 06 00 15 09
0000020 00 16 00 17 08 00 18 0a 00 19 00 1a 07 00 1b 07
0000040 00 1c 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29
根据 JVM 规范,类文件结构如下:
u1表示一个字节(8 bit)、u4表示4个字节
一个字节可以表达2的8次方
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_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
1)魔数 u4 magic 对应字节码文件的 0~3 个字节 0000000 ca fe ba be 00 00 00 34 00 23 0a 00 06 00 15 09 ca fe ba be :意思是 .class 文件,不同的东西有不同的魔数,比如 jpg、png 图片等! 2)版本
u2 minor_version;
u2 major_version;
0000000 ca fe ba be 00 00 00 34 00 23 0a 00 06 00 15 09
00 00 00 34:34H(16进制) = 52(10进制),代表JDK8
3)常量池
由于常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项 u2 类型的数据,代表常量池容量计数值。
0x16表示长度,十进制是22
红色是第一项,0x07表示**CONSTANT_class_info 类型常量,**0x0002表示name_index的地址。
绿色是第二项,0x01表示**CONSTANT_Utf8_info 类型常量,**长度是0x001D,在后面是具体字符串
4**)访问标志**