一、类加载流程图
二、从加载到类实例化的完整过程
三、类的加载
- 类的加载的最终产品是位于内存中的Class对象(不涉及到对象)。
- Class对象封装了类在方法去内的数据结构,并且向java程序员提供了访问方法区内的数据结构的接口。
-
两种类型的加载器
Java虚拟机自带的加载器
- 根类加载器(启动类加载器):Bootstrap
- 扩展类加载器:Extension
- 系统(应用)类加载器(AppClassLoader):System
![]()
用户自定义的加载器
- java.lang.ClassLoader的子类。
- 用户可以自定义类加载的方式。
-
类的加载时机
类加载器并不需要等到某个类被“首次使用”时再去加载它。
JVM规范允许类加载器预料某个类将要被加载时就预先去加载它,如果在预先加载的过程中遇到.class文件缺失或是存在错误,类加 载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)。如果这个类一直没有被程序主动使用,呢么类加载器就不会报 告错误。
-
类的验证
类被加载后,就进入连接阶段,连接就是将已经读入内存的类的二进制数据合并到虚拟机的运行时环境中。
类的验证的内容:
- 类文件的结构检查;
- 语义检查;
- 字节码验证;
- 二进制兼容性验证。
-
类的准备阶段
为静态变量分配内存,设置默认值,但在达到初始化之前,类变量都没有被初始化成真正的默认值。
-
类的解释阶段
就是在类型的常量池中寻找类、接口、字段和方法的符号引用,把这些符号引用替换成直接引用的过程。
-
类的初始化
为类的静态变量赋予真正的默认值。静态变量初始化的两种途径:变量声明处、静态代码块中。
类的初始化步骤:
类的初始化时机: