类的加载过程
- 类的加载时机
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载七个阶段。其中,验证,准备,解析三个部分统称为连接。
四种情况必须立即对类进行初始化:
1)new 静态属性 静态方法调用
2)People.class 获取Class对象
3)加载子类时需要提前加载父类
4)启动JVM,main函数所在的类需要加载
- 类的加载过程
文件类型:后缀名+魔数
魔数:识别文件类型
.class字节码文件结构
.class字节码文件结构磁盘上存储的一个byte数组:4个byte魔数+4个byte主次版本号+常量池+…
第一大阶段:装载阶段-》类加载器
启动类加载器Boostrap
ClassLoader
扩展类加载器 Extension ClassLoader
应用类加载器 Application
ClassLoader
无法加载,抛出异常
ClassNotFoundException
加载类:双亲(parent)委派模型
从子类到父类依次查找之前是否加载过这个类,如果加载过,返回加载后的产物(Class对象)。如果当前类加载器没有加载过这个类,向父类继续查找。
如果一个类的加载器是启动类加载器,返回null
装载成功的产物,当前类的Class对象(保存当前类的类信息)Java堆
第二大阶段:链接阶段
验证:符合虚拟机要求,不能危害虚拟机安全
准备:给静态变量开辟内存并赋类型默认值
解析:解析阶段是虚拟机将常量池内的符号引用替换为直接引用
第三大阶段:初始化阶段
给静态变量赋值。