一 类加载机制
虚拟机把Class文件加载到内存中,并对数据进行验证、准备、解析、初始化,最终形成可以被虚拟机使用的java类型,这就是类加载机制。
二 类加载过程
5个阶段: 加载 验证 准备 解析 初始化
1 加载
加载后的产物:生成类的二进制字节流
2 验证
1)目的
检查class文件字节流包含的信息是否符合虚拟机的要求,避免有危害虚拟机的信息
2)验证过程
文件格式验证:验证字节流是否符合Class文件格式规范
元数据验证: 类的验证,例如:类继承接口,是否实现接口所有方法
字节码验证: 类中方法进行验证,例如:方法中类型转换
符号引用验证:例如:符号引用中的类、字段、方法的访问性是否能被当前类访问
总结:
验证过程从文件格式、类、方法、符号引用四个过程进行验证的,从外到内的验证过程
3 准备
1)目的
为类变量(被static修饰)设置初始值; 在方法区分配;
public static int value=123; 准备阶段类变量会初始为0
常量会在准备阶段就会赋予最终值,如下:
public static fnal int value=123; 准备阶段常量会初始为123
4 解析
1)介绍
将常量池内的符号引用替换为直接引用的过程
解析的时间点根据需要来触发
2)四种引用的解析过程
a 类或接口的解析
b 字段解析
c 类方法解析
d 接口方法解析
5 初始化
准备阶段已经对类变量设置初始值了,初始化阶段则根据实际值去初始化类变量和static静态块。
初始化阶段也是执行类< client >()方法的过程:
< client >(): 由类变量和静态语句块组成(类变量初始化顺序优先于static静态代码块)
有父类,先初始化父类的< client >(),在调用子类的< client >()
虚拟机会保证类的< client >()方法在多线程下正确的加锁和同步,只会有一个线程会执行此方法。