class字节码结构(二)(访问标志、类索引、父类索引、接口索引集合)

时间:2022-05-19 22:30:07

《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合

字节码总体结构:

class字节码结构(二)(访问标志、类索引、父类索引、接口索引集合)

访问标志(access_flags)能够表示什么?

访问标志(access_flags)紧接着常量池后,占有两个字节,总共16位,如下图所示:

class字节码结构(二)(访问标志、类索引、父类索引、接口索引集合)

存放的是这个类或者接口的访问标志信息:是否具有某种标准用1标识。

class字节码结构(二)(访问标志、类索引、父类索引、接口索引集合)

类或者接口(包括内部类,静态内部类)都会单独生成一个class文件。

ACC_SUPER标志位:表示这个class是否是类。
ACC_INTERFACE标志位:表示这个class是否是接口。
ACC_PUBLIC标志符:接口或者类是否是public
ACC_ABSTRACT标志位:是否是抽象类(不过接口也会被认为是抽象类)
ACC_FINAL标志位:是否是final(是否可以被继承)
ACC_SYNTHETIC标志位:字节码是否通过源码生成(0是源码,1是手写的字节码)
ACC_ENUM标志位:class是否是枚举类型
ACC_ANNOTATION标志位:class是否是注解。

一个例子:

package com.louis.jvm;
public class Simple {
}

javap -v Simple > temp.txt,将结果重定向到文件中

class字节码结构(二)(访问标志、类索引、父类索引、接口索引集合)

对应的2精制效果:

class字节码结构(二)(访问标志、类索引、父类索引、接口索引集合)

上面都是采用十六精制表示的。

类索引(this_class)是什么?

 类索引的作用,就是为了指出class文件所描述的这个类叫什么名字。

class字节码结构(二)(访问标志、类索引、父类索引、接口索引集合)

class字节码结构(二)(访问标志、类索引、父类索引、接口索引集合)

通过索引指向常量项,那个类对应的索引常量项。

父类索引(super_class)是什么?

父类索引这两个字节中的值指向了常量池中的某个常量池项CONSTANT_Class_info,表示该class表示的类是继承自哪一个类。

class字节码结构(二)(访问标志、类索引、父类索引、接口索引集合)

接口索引集合(interfaces)是什么?

一个类可能有多个接口,所以是接口的集合。

class字节码结构(二)(访问标志、类索引、父类索引、接口索引集合)

因为接口数目不确定,所以接口索引集合前部分有个接口计数器。

集合中的每个索引都指向接口的名字的索引常量项。

例子如下:

public interface Worker{
public void work();
}
package com.louis.jvm;
public class Programmer implements Worker {
@Override
public void work() {
System.out.println("I'm Programmer,Just coding....");
} }

class字节码结构(二)(访问标志、类索引、父类索引、接口索引集合)