当程序主动使用某个类时,如果该类还未被加载到内存中,JVM会通过加载、连接、初始化3个步骤对该类进行类加载。
1. 加载:加载指的是将类的class文件读入到内存中,并为之创建一个java.lang.Class对象。 类的加载由类加载器完成,类加载器由JVM提供,开发者也可以通过继承ClassLoader基类来创建自己的类加载器。 通过使用不同的类加载器可以从不同来源加载类的二进制数据,通常有如下几种来源:
- 从本地文件系统加载
- 从jar包加载
- 通过网络加载,把一个Java源文件动态编译,并执行加载
2. 连接 当类被加载之后,系统为之生成一个对应的Class对象,接着进入连接阶段,连接阶段负责将类的二进制数据合并到JRE中。类连接又可分为三个阶段:
2.1 验证
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
2.2 准备 为类的静态变量分配内存,并设置默认初始值。
2.3 解析 将类的二进制数据中的符号引用替换成直接引用。
3. 初始化为类的静态变量赋予初始值。