Class文件结构

Class

Class类文件是一组以8字节为基础单位的二进制流。当需要占用8位字节以上空间的数据项时,会按照高位在前的方式分割成若干个8位字节进行存储。

数据类型:无符号数和表

一.(头4个字节)魔数

用来确定文件类型。
Class文件魔数:(头4个字节)0xCAFEBABE:咖啡宝贝

二.(4个字节)版本号

前两个字节是次版本号,后两个字节是主版本号。
版本号从十进制的45开始,每代JDK版本升一级就+1。

三.常量池

–常量池容量计数器:常量池入口有一项u2类型的数据(从1开始计数的)
从1开始计数的原因:0空出来,因为某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项目”的含义
–常量池主要存放:字面量和符号引用
字面量:类似于常量概念,如文本字符串,声明为final的常量值等。 符号引用:编译原理的概念。
1.类和接口的全限定名。
2.字段的名称和描述符。
3.方法的名称和描述符。

四.访问标志

用于识别一些类或者接口层次的访问信息。(如:是类或接口?是否public?等等)                     

五.类索引,父类索引,接口索引

类索引和父类索引是u2类型的数据,接口索引是u2类型的数据集合。

六.字段表集合

字段表用于描述接口或者类中声明的变量。(包括类级变量和示例级变量,但不包括方法内部的局部变量)

七.方法表集合

方法表描述方法的。

八.属性表

1.Code属性:方法体代码经过编译器处理后最终变为字节码指令存储在Code属性内。
            (注意:接口和抽象类中的方法并不在Code属性中)
2.Exceptions属性:列举处方法中可能抛出的受查异常(也就是方法描述时在throws后边列举的异常)
3.LineNumberTable属性:描述Java源码行号与字节码行号之间的对应关系。
4.LocalVariableTable属性:描述栈帧中局部变量表中的变量与Java源码中定义的变量之间的关系。
5.SourceFile属性:记录生成这个Class文件的源码文件名称。
6.ConstantValue属性:通知虚拟机自动为静态变量赋值。
7.InnerClasses属性:记录内部类与宿主类之间的关联。
8.Deprecated与Synthetic属性:标志类型的布尔属性。
                   Deprecated:表示某个类,字段或者方法
                   SourceFile:代表此字段并不是由JAVA源码直接产生的。
9.StackMapTable属性:代替以前比较消耗性能的数据流分析的类型推导验证器。
10.Signature属性:与泛型有关。
11.BootstrapMethods属性:用于保存invokedynamic指令引用的引导方法限定符。