Class文件的结构里面只有两种数据类型:无符号和表
无符号数是属于这种结构里基本的数据类型:u1,u2,u4,u8分别代表1,2,4,8个字节,可以用来描述数字,索引引用,数量值,和UTF-8编码构成字符串值。(接下来那张花花绿绿的表结合这些数据以及总体格式表还有常量池的14种常量项的结构总表来看)
表是由无符号数以及其他的表作为数据项构成的复合数据类型。
这里是Class文件格式表。
这是一段代码。
public class TestClass{
private int m;
public int inc(){
return m+1;
}
}
这里是对应的用十六进制编辑器WinHex打开的Class文件的结果。(每个对应的数字都是十六进制的)
前四个字节是魔数,魔数的话可以自行去百度,5,6字节是次版本号,7,8字节是主版本号,也就是52.0。
0x0013换算一下也就是19,也就是有18项常量,索引值从1到18,设计者把第0项空了出来,做特殊考虑。接下来就是18项常量了。下面是常量池的14种常量项的结构总表。
第一项的标志位是0x0A,也就是这一个
结合结构总表来看就是除了第一个标志位是刚说过的0x0A占据一个字节,剩下两项是索引各占两个字节共五个字节为一项常量,两个索引分别指向其他的常量,从1开始,指向第四个,也就是这一个
这一项标志位是0x07,是这一个
有一个标志位,还有一个两字节的索引,指向第十八个常量,也就是最后一个常量,是这个红色的。
也就是先看十六进制的文件,在查阅文件格式表,看一下标志位是哪一项,标志位后面跟的是什么,占多少字节,比较繁琐的是常量池的14种常量项的结构总表,分类出来的东西比较多。
参考书籍:《深入理解JAVA虚拟机》