Java虚拟机如何加载类

虚拟机加载类的过程

从class文件到内存中的类,总体来说分为三个阶段:加载、链接以及初始化

加载

  • 加载,是指查找字节流,并根据其创建类的过程。这个字节流,通常是来自于class文件。Java虚拟机需要借助类加载器来完成查找字节流这一过程。
  • 双亲委派模型:每当一个类加载器接收到加载请求时,它会先将请求转发给父类加载器。在父类加载器没有找到所请求的类的情况下,该类加载器才会尝试去加载。
  • 启动类加载器(bootstrap class loader) 由C++实现的,没有对应的Java对象。负责加载最基础、最重要的类 例如 JRE lib 目录下jar包中的类。还有其他两个比较重要的类加载器: 扩展类加载器(extension class loader)和应用类加载器(application class loader) 这两个由Java的核心类库提供。
  • 扩展类加载器的父类加载器是启动类加载器。它加载相对次要,但通用的类。例如存放在 lib/ext 目录下jar包中的类。
  • 应用类加载器的父类加载器是扩展类加载器。它加载应用程序路径下的类。
  • Java9 引入了模块系统。扩展类加载器改名为平台类加载器。JavaSE中的除了少数模块由启动类加载器加载,如java.base,其他模块由平台类加载器加载。平台类加载器由原来的扩展类加载器进一步拓展了。。抢了父类加载器的活??
  • 类加载器除了加载功能外还有命名空间的作用。在Java虚拟机中,类的唯一性是由类加载器实例和类的全名一同确定的。

链接

  • 链接是指将创建的类合并至Java虚拟机,使之能够执行的过程。可分为验证、准备和解析三个阶段。
    • 验证:确保被加载类能够满足虚拟机的约束条件。
    • 准备:为被加载类的静态字段分配内存。
    • 解析:对于一个方法调用,编译器会生成一个包含目标方法所在类的名字、目标方法的名字、接收参数类型以及返回值类型的符号引用,来指代所要调用的方法。解析阶段的目的,正是将这些符号引用解析成为实际引用。如果这个符号引用指向一个未被加载的类或者未被加载类的字段或方法,那么这时会触发这个类的加载。

初始化

  • 初始化是指对标记为常量值的字段进行赋值,以及执行方法的过程。类的初始化只会执行一次。

你可能感兴趣的:(Java虚拟机如何加载类)