Class文件结构介绍[访问标志,类索引,父类索引,接口索引集合]

简介: 在常量池结束后,紧接着的两个字节代表访问标志(access_flags),这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口,是否定义为public类型,是否定义为abstract类型,如果是类的话是否被声明为final等,


访问标志

 在常量池结束后,紧接着的两个字节代表访问标志(access_flags),这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口,是否定义为public类型,是否定义为abstract类型,如果是类的话是否被声明为final等,

image.png

注意:access_flags中一共有16个标志位,此处只列举了其中8个。

定义此类:

public final  class Test2 {
  private static final String NAME="bobo";
  private int age = 18;
  public void fun1(){
    int b = 20;
    int c = 30;
    int d = b+c+age;
    System.out.println(d);
  }
}

访问标志对应的信息

image.png

 标识结果的值为0x0031,是多标识符组成,即由多个标识符的值累加得来。因为标识符对应的值的特殊性,值累加后的结果可以唯一定位由哪些标识符组成,常见的0x0021只有ACC_SUPER和ACC_PUBLIC的值累加才能得到,而上面的0x0031只有ACC_SUPER与ACC_FINAL与ACC_PUBLIC的值累加后得到。

类索引,父类索引与接口索引集合

 类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,接口索引计数器也是一个u2类型的数据,接口索引集合则是一组u2类型的数据集合,Class文件中的这几项数据来确定这个类的继承关系

类索引

 确定当前类的全限定名

image.png

image.png

父类索引

 确定当前类的父类的全限定名。由于java单继承的原则,所以父类只可能有一个;由于Object是所有其他类的基类,所以除了Object类本身的super_class为0意外,其余的所有类的super_class都不为0.

image.png

接口索引集合

 按照当前类implements(或者当前接口extends)的接口顺序,从左往右排列在接口的索引集合中。

public final  class Test2 implements Serializable,Runnable{
  private static final String NAME="bobo";
  private int age = 18;
  public void fun1(){
    int b = 20;
    int c = 30;
    int d = b+c+age;
    System.out.println(d);
  }
  @Override
  public void run() {
    // TODO Auto-generated method stub
  }
}

对应的接口索引:

image.png

小结:

 类索引的直接值,父类索引的直接值,接口索引集合中的索引的直接值,代表的是一个常量池中的索引值,该索引值对应为一个CONSTANT_Class_info , CONSTANT_Class_info 又指向CONSTANT_Utf8_info,CONSTANT_Utf8_info中存储着全限定名字符串信息。

参考《深入理解Java虚拟机》


相关文章
|
Java 索引
JVM虚拟机-Class文件之类索引、父类索引和接口索引集合
JVM虚拟机-Class文件之类索引、父类索引和接口索引集合
120 1
JVM虚拟机-Class文件之类索引、父类索引和接口索引集合
|
Java 编译器 索引
JVM虚拟机-Class文件之字段表集合
JVM虚拟机-Class文件之字段表集合
JVM虚拟机-Class文件之字段表集合
|
C++ 容器
C++ vector 赋值、删除、排序类之外的其他函数
C++ vector 赋值、删除、排序类之外的其他函数
131 0
JVM虚拟机-Class文件之方法表集合
JVM虚拟机-Class文件之方法表集合
111 0
JVM虚拟机-Class文件之方法表集合
|
小程序 Java
Java——静态字段和实例字段的初始化说明(概念理解+应用举例)
Java——静态字段和实例字段的初始化说明(概念理解+应用举例)
Java——静态字段和实例字段的初始化说明(概念理解+应用举例)
|
Java 索引
【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )(三)
【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )(三)
119 0
【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )(三)
|
Java 数据挖掘 索引
【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )(一)
【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )(一)
133 0
【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )(一)
|
Java 索引
【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )(二)
【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )(二)
130 0
【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )(二)
|
Java 数据挖掘 索引
【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )(一)
【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )(一)
164 0
【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )(一)
|
Java 索引
【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )(二)
【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )(二)
139 0
【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )(二)