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 文件结构中的访问标志与索引,其中索引我们又细分了四部分结构进行了讲解,分别是类索引,父类索引,接口索引计数器以及接口索引集合。通过本节的学习,我们了解了它们的定义及意义,也了解了它们的数据类型及示意图。

本节我们也抛出了问题,接口索引集合后边紧跟的结构是什么?我们会在下篇课程中进行讲解。本节所了解到的访问标志与索引相关知识均为重点内容,学习者需要用心掌握。