概述:
JAVA Class文件的装载流程包含三个阶段:加载、链接、初始化。而链接又分为:验证、准备、解析三个步骤。
类并不是在任何时刻就马上装载的,他是需要一定的条件。正常情况下,类的装载分为主动和被动两种情况。其中主动装载会初始化一个类(这里所谓的初始化是初始化静态块和静态变量,而不是我们通常说的构造函数)。主动装载分为以下几种情况:
- 使用new关键字或者通过反射、克隆、反序列化来创建一个类的实例
- 调用类的静态方法
- 使用类或接口的静态字段时(不包括final)。
- 使用java.lang.reflect包中的反射类的时候
- 初始化子类的时候,要求先初始化父类
- 作为虚拟机,包含有main方法的那个类
以上几种情况,是我们的主动加载,主动不仅会加载一个类,还会连接初始化一个类。除主动加载类的方法外,其他的都是被动加载。如:通过一个子类调用父类的静态变量,我们只会初始化父类(即实际拥有静态变量的那个类,通过一个类引用静态常量(static final),实际上这种情况不仅不会初始化类,而且还不会加载这个类,这是因为我们的JAVA虚拟机在这种情况下,直接将常量放到了常量池中。
加载类
加载类分为三个阶段:
1. 通过类全名获取二进制数据流
2. 解析类的二进制数据流为方法区的数据结构
3. 创建java.lang.class类的实例,表示该类型
通常情况下,在加载一个类的时候ÿ