一、魔数
每个class的头4个字节叫做魔数,用来表示这个文件是不是能被虚拟机所识别的文件。这个值就是cafebabe(咖啡宝贝)。
二、版本号
class文件中,第5和第6个字节表示的是java的此版本好,第7和第8个字节是主版本号,上图中0034表示的是10进制的52,也就是java8的版本。依次类推,JDK7表示51,JDK6表示50。
三、常量池
常量池可以作为class文件中的资源仓库。其中常量池中主要存放字面量(Literal)和符号引用(Systembolic References)。
字面量:可以理解为我们在代码中定义的值:如字符串的值,被声明为final的常量值。
符号引用:主要包括被模块导出或者开放的包;类和接口的全限定名;字段的名称和描述符;方法的名称和描述符;方法句柄和方法类型;动态调用点和动态常量。
以下面这段代码为例:我们可以使用javap -verbose来查看代码中的全部常量池信息:
示例代码:
public class TestClass {
private int m;
public int inc() {
return m + 1;
}
}
其中常量池部分如下:
四、访问标志
访问标志是用来识别类或者接口的访问权限,例如public,final,abstract等字段。
标志名称 | 标志值 | 含义 |
ACC_PUBLIC | 0x0001 | 是否为public类型 |
ACC_FINAL | 0x0010 | 是否被声明final,只有类可设置 |
ACC_SUPER | 0x0020 | 是否允许使用invokespecial。 |
ACC_INTERFACE | 0x0200 | 标识这是一个接口 |
ACC_ABSTRACT | 0x0400 | 是否为abstract类型,对于接口或者抽象类来说,此标志值为真,其他类型值为假 |
ACC_SYNTHETIC | 0x1000 | 标识这个类并非由用户代码产生的 |
ACC_ANNOTATION | 0x2000 | 标识这是一个注解 |
ACC_ENUM | 0x4000 | 标识这是一个枚举 |
ACC_MODULE | 0x8000 | 标识这是一个模块 |
五、字段表集合
用于描述接口或者类中声明的变量;其中对于描述符来描述方法时,按照先参数列表、后返回值的顺序描述。()I表示,参数为空,返回类型为int。
标识字符 | 含义 |
B | 基本类型byte |
C | 基本类型char |
D | 基本类型double |
F | 基本类型float |
I | 基本类型int |
J | 基本类型long |
S | 基本类型short |
Z | 基本类型boolean |
V | 特殊类型void |
L | 对象类型,如Ljava/lang/Object |
六、属性表集合
用来描述某些场景专有的信息。