类加载分为如下几个阶段
加载
验证
准备
解析
初始化
加载
所谓加载即将java字节码加载到内存中,也就是我们常见的用类加载器loadClass到内存中,我们都知道java字节码主要由魔数、此版本好、主版本号、常量池大小、常量池信息、类的访问控制权限、类名、父类名、接口个数、接口信息、字段个数、字段信息、方法个数、方法信息、属性个数、属性信息等。需要对这些信息做一个解析
验证
验证阶段主要是对字节码文件的格式,java版本等进行验证
准备
为static变量赋初值,如果变量被final修饰则直接赋值
解析
该阶段是对常量池类的符号引用转化成直接引用
初始化
初始化即调用 < cinit >()V
方法,虚拟机会保证这个类的 【构造方法】的线程安全,所以说这个阶段是会进行加锁,写代码时需要避免循环引用导致死锁。