.java文件,会被编译为可在虚拟机上运行的class文件。
class文件是一个以8位字节为基础的二进制数据流,当大数据超过八位时,就会被分为若干个八位字节的文件进行存储。
class文件内部紧密排列,无间隙存在。
class文件是一个类似于c语言存贮的伪结构体。伪结构体中仅仅只包括无符号数,以及表,解析都是以这两种数据类型为基础进行解析的。
无符号数为基本数据类型,以u1,u2,u4,u8来代替1,2,4,8的无符号数。
一,魔数与class版本
class文件的头四个数,被称之为魔数,该数字定义一个能被虚拟机接受的class文件。
class文件后,第5,6个字节为次版本号,7,8为主版本号。
版本号的最高级别代表着可以运行的class文件最高版本。所以它可以向下兼容低版本。
(但是笔者还是碰到了在1.8编译的文件可以在1.7运行这个问题,这个原因是因为,1.8可能编译的版本号低于1.7能运行的最高的版本号)
二,常量池
class文件中,跟在主版本号,和次版本号之后。
常量池入口会放置一个u2类型的数据,代表着常量池的容量,容量计数从1开始,而不是我们所熟知的从0开始。
常量中存在字面量,和符号引用常量
字面量包含字符串,final修饰的的常量
符号引用包括,类和接口的全限定名,字段的名称和描述符,方法的名称和描述符。
三,访问标志
常量池之后的两位为访问标志,标记是个类,还是接口,是public 还是abstract
四,父类索引,类索引,接口索引
都是一个u2类型的数据
五,字段表集合
用于描述接口或者类中声明的变量。包括类级变量或者实例级变量,但是不包括方法内部变量。
六,方法表集合
访问标志,名称索引,描述符索引,属性表集合
七,属性表集合