Class 文件的访问标志与索引
1. 前言
本节内容主要是介绍 Class 文件结构中的访问标志与索引,其中索引又细分为类索引、父类索引、接口索引计数器、接口索引集合四个知识点。本节主要知识点如下:
- 访问标志的定义及意义,以及结构示意图,为本节重点内容之一;
- 访问标志的标记类型及标记值对应表,为本节的次重点内容;
- 类索引、父类索引、接口索引计数器、接口索引集合的定义及示意图,为本节内容之一。
本节的索引过程讲解对于初学者来说会有一定的难度,讲解过程也会涉及到之前所学习的常量池知识,学习者需要结合之前所学知识去理解索引,并进一步的加深对常量池的认识。
2. 访问标志(access_flags)
Tips:前文在讲解常量池部分的最后提出过问题,Class文件结构的常量池后边紧跟的是什么结构呢?访问标志,就是我们寻求的答案。
定义:在常量池结束之后,紧接着的 2 个字节代表访问标志(access_flags),访问标志用于识别一些类或接口层次的访问信息。
从定义的描述中我们可以了解到,访问标志也是无符号数类型的数据,既然访问标志占用了 2 个字节,那么访问标志的占用空间也可用 u2 来表示。
无符号数结构示意图:
从上图中,我们能够清晰的看到访问标志占用了 2 个字节,是类似于我们之前所学习的常量池计数器的,因为常量池计数器也是占用了 2 个字节,均为 u2 大小。
3. 访问标志类型对应表
这部分内容为次重点内容,通过对这部分的学习,学习者需要了解访问标志的不同类型,以及不同类型的访问标志的意义。我们先来看下对应表,后续我会举例说明。
标志类型 | 对应标志值 | 标志意义 |
---|---|---|
ACC_PUBLIC | 0x0001 | 是否为 public 类型 |
ACC_FINAL | 0x0010 | 是否被声明为 final 类型 |
ACC_SUPER | 0x0020 | 是否允许使用 invokespcial 字节码指令的新语义 |
ACC_INTERFACE | 0x0200 | 标识这是一个接口 |
ACC_ABSTRACT | 0x0400 | 是否为抽象类型 |
ACC_SYNTHETIC | 0x1000 | 标识这个类并非由用户代码生成 |
ACC_ANNOTATION | 0x2000 | 标识这是一个注解 |
ACC_ENUM | 0x4000 | 标识这是一个枚举 |
我们举个简单的例子来理解下访问标志以及这张对应表。假设需要访问一个接口,那么此时访问标志 ACC_INTERFACE 的值为 true,标志对应的值为 0x0200。这样 JVM 虚拟机在处理访问的时候,就能够做到有据可依。
4. 类索引与父类索引
定义:类索引(this_class)和父类索引(super_class)都是一个 u2 大小的数据。
- 类索引:确定当前类的全限定名。
- 父类索引:确定当前类的父类的全限定名。
Tips:由于 Java 单继承的原则,父类只可能有一个;由于 Object 是所有其他类的基类,所以除了 Object 类没有父类以外,其余所有类的 super_class 都不为空。
无符号数结构示意图:类索引是紧跟在访问标志之后的结构,类索引后边紧跟的结构是父类索引。由于类索引与父类索引关系非常紧密,都是描述的当前类以及当前类的父类的全限定名,所以此处我们将二者放在一起进行讲解。
5. 接口索引计数器与接口索引集合
父类索引后边紧跟的是接口索引计数器,接口索引计数器后边紧跟的是接口索引集合。类似于常量池计数器和常量池的关系,接口索引计数器记录的是接口索引集合中接口索引的数量。
Tips:对于常量池计数器和常量池,一个是无符号数类型,一个是表类型。相比而言,接口索引计数器和接口索引集合皆为无符号数类型,这里学习者可以进行对比记忆。我们继续来看下两者的定义以及无符号数类型的结构示意图。
定义:
- 接口索引计数器:代表了接口索引集合中接口的数量;
- 接口索引集合:按照当前类 implements(或当前接口extends)的接口的顺序,从左到右依次排列在接口索引集合中,此部分集合称为接口索引集合。
无符号数结构示意图:接口索引计数器和接口索引集合均为无符号数类型结构,结构示意图如下图所示。
从图中可以看出,接口索引计数器占用了 2 个字节,为 u2 大小,接口索引集合中的每一个接口元素占用了 2 个字节大小,也为 u2 大小。
Tips:接口索引集合后边紧跟的数据结构是什么?我们继续抛出问题,后续章节会有问题的解答,让我们带着问题继续探究 Class 文件结构。
6. 小结
本节讲解了 Class 文件结构中的访问标志与索引,其中索引我们又细分了四部分结构进行了讲解,分别是类索引,父类索引,接口索引计数器以及接口索引集合。通过本节的学习,我们了解了它们的定义及意义,也了解了它们的数据类型及示意图。
本节我们也抛出了问题,接口索引集合后边紧跟的结构是什么?我们会在下篇课程中进行讲解。本节所了解到的访问标志与索引相关知识均为重点内容,学习者需要用心掌握。