接上篇文章
class文件在常量池之后存放的依次是: 类信息描述
,字段表集合
,方法表集合
以及类属性
。
我们首先来看
类信息描述
类信息描述
的结构如下:
表1
类信息描述中,最开始的两个字节是访问标识符,访问标识符在后面的字段表以及方法表中还会用到。它的思想是一贯的。
我们知道2个字节一共有16个比特,每个比特可以代表一个bool型值。访问标志正是利用这16个比特的0和1来给出“访问信息”的。访问信息有哪些?顾名思义,访问信息是描述访问权限等方面信息的。一共有8个,列表如下:
访问信息 表2
这里注意一下“值”和比特位之间对应关系的换算,例如:
abstract : 0x0400
表示的是从右向左第11个比特为1。
结合在上篇文章中编译的class文件,我们以16进制文本打开对应位置:
图1
下划线画出的0x00 21
这两个字节就是紧接着常量池后面的类的“访问信息”,结合上面的表访问信息,我们可以看到,除了public和super标志位为1,其他的都为0。由此,我们可以得出这是一个public类型的类,未被声明为final,允许使用invokespecial字节码指令,非接口,未被声明为final型,非接口,非抽象型,为用户代码生成,非注解,非枚举。
接下来两个字节是本类索引,这两个字节值0x00 04
,指向的是常量池中的一个Class类型的常量。再接下来是父类索引,这两个字节0x00 05
,同样指向常量池中的一个Class类型常量。对照上篇文章中生成的常量池:</