总体概括
类加载过程:加载 → 链接 → 初始化
其中,链接阶段包括:验证 → 准备 → 解析
加载
加载,是指查找字节流并据此创建类的过程。字节流的来源可能是.class文件也可能从网络加载。对于数组类型来说,它并没有字节流,由 java 虚拟机直接生成。对于其他类型来说,java 虚拟机需要借助类加载器来加载。
java9 之前,类加载器包括:启动类加载器,扩展类加载器,应用程序类加载器
java9 及以后:启动类加载器,平台类加载器,应用程序类加载器
类加载器遵循双亲委派原则,当某个类加载器加载类之前,先要将加载操作委派给父类加载器,当父类加载器加载不到该类时,才由自己来加载。这样是为了避免一个类被多次加载。
链接
链接是指将已经构造好的类合并到 java 虚拟机中。在合并之前,需要进行验证这个类的结构是否符合 java 虚拟机规范。然后需要给静态字段赋值,将符号引用变为直接引用。
- 验证:验证加载的类是否满足java 虚拟机规范
- 准备:给类的静态字段分配内存
- 解析:将符号引用转化为直接引用
初始化
给类的静态字段赋值,其中包括静态字段的赋值语句和 static 代码块中的语句。这两部分的代码会被合并到<clinit>函数中,java 虚拟机会保证该方法只被执行一次。
面试准备
面试官:说一下类的加载过程
我:java 类的加载过程分为加载、链接、初始化三个步骤。在加载步骤中,java 虚拟机借助类加载器来查找类的字节码,然后通过查找到的字节码构造出该类。链接步骤中,包含验证、准备、解析三个小步骤,其中验证就是指验证一下这个类的结构是否满足 java 虚拟机规范。准备是指为类的静态字段准备内存空间。解析是指将类的符号引用转化为直接引用。最后一个大步骤初始化,是指根据静态字段的赋值语句和类中的静态代码块给类中的静态字段赋值。
面试官:好的,回去等消息吧 ~
我:啊?卧槽?