《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合
字节码总体结构:
访问标志(access_flags)能够表示什么?
访问标志(access_flags)紧接着常量池后,占有两个字节,总共16位,如下图所示:
存放的是这个类或者接口的访问标志信息:是否具有某种标准用1标识。
类或者接口(包括内部类,静态内部类)都会单独生成一个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,将结果重定向到文件中
对应的2精制效果:
上面都是采用十六精制表示的。
类索引(this_class)是什么?
类索引的作用,就是为了指出class文件所描述的这个类叫什么名字。
通过索引指向常量项,那个类对应的索引常量项。
父类索引(super_class)是什么?
父类索引这两个字节中的值指向了常量池中的某个常量池项CONSTANT_Class_info,表示该class表示的类是继承自哪一个类。
接口索引集合(interfaces)是什么?
一个类可能有多个接口,所以是接口的集合。
因为接口数目不确定,所以接口索引集合前部分有个接口计数器。
集合中的每个索引都指向接口的名字的索引常量项。
例子如下:
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....");
} }