类加载有五个过程:加载->验证->准备->解析->初始化
1、加载:加载是类加载的一个过程,加载的过程中,要完成三个步骤:
- 通过类的全限定名获取类的字节码文件
- 将字节码转化为运行时数据结构
- 在内存中生成一个class对象,作为方法区进入这个类的入口
注意:对于数组不需要通过类加载的过程,有JVM动态构造出来的,但是内部的元素还是要通过类加载的过程。
2、验证
验证是链接的第一步,主要是验证是否符合JVM规定的class文件格式
- 文件格式验证
主要判断是否符合class文件格式:是否一魔数开头,JVM版本是否符合,常量池的常量tag等
- 元数据验证
判断加载类是否有父类,是否继承了不允许继承的类,是否为抽象类,如不是是否实现了父类或者接口的所有方法
- 字节码验证
验证程序语义是否合法,是否符合逻辑,对类的方法体进行校验和分析
- 符号引用验证
验证类中引用的资源(类,变量,方法)是否存在,访问权限是否合法
3、准备
准备是链接的第二步,目的是将类的静态变量分配内存,初始化默认值,主要还是八种数据类型,以及引用类型
注意:boolean在内存当中存储的时候是按照int类型存储的,0表示true,1表示false
4、解析
解析是链接的第二步,主要就是将类,接口,变量,方法的间接引用转化为直接引用
符号引用:用一组符号来描述锁引用的目标,这个符号能定位到目标
直接引用:直接指向目标的指针、偏移量以及能够间接定位到目标的句柄
5、初始化
这是JVM类加载的最后阶段,执行类构造器里面的<cinit>方法,对类的静态变量和静态方法进行初始化操作