返回

如何深入了解类加载过程?

后端

## 类加载概述

类加载是 Java 虚拟机 (JVM) 将类文件从磁盘加载到内存的过程。类加载器负责寻找和加载类文件,并将其转换成 JVM 可以执行的字节码。

## 类加载器

Java 中有以下几种类加载器:

  • 引导类加载器 (Bootstrap ClassLoader) :Bootstrap ClassLoader 是 Java 虚拟机自带的类加载器,用于加载 Java 运行时环境 (JRE) 自身所需的类,如 java.lang 包中的类。
  • 扩展类加载器 (Extension ClassLoader) :Extension ClassLoader 用于加载 Java 扩展目录中的类,如 jre/lib/ext 目录中的类。
  • 系统类加载器 (System ClassLoader) :System ClassLoader 用于加载 Java 类路径 (classpath) 中的类,如 java -classpath 选项指定的类路径。
  • 自定义类加载器 (Custom ClassLoader) :自定义类加载器可以由开发者自行编写,用于加载特定的类。

## 类加载过程

类加载过程可以分为以下几个步骤:

  1. 查找类文件 :类加载器首先会尝试从本地缓存中查找类文件。如果没有找到,则会根据类的全限定名到文件系统或网络上查找类文件。
  2. 加载类文件 :找到类文件后,类加载器会将类文件加载到内存中。类文件加载到内存后,JVM 会将其转换成字节码。
  3. 链接类 :链接类是指将类文件中的信息与 JVM 的数据结构关联起来的过程。链接类包括以下几个步骤:
    • 验证类 :验证类是指检查类是否符合 Java 虚拟机规范。如果类不符合规范,则会抛出 VerifyError 异常。
    • 准备类 :准备类是指为类的静态变量分配内存空间并将其初始化为默认值。
    • 解析类 :解析类是指将类的符号引用替换为直接引用。
  4. 初始化类 :类初始化是指执行类的静态初始化块和静态方法的过程。类初始化只会在类第一次被使用时进行。

## 双亲委派机制

双亲委派机制是 Java 类加载器的一种机制。双亲委派机制是指类加载器在加载类时,会先将加载请求委托给父类加载器。如果父类加载器能够加载该类,则由父类加载器加载该类。如果父类加载器无法加载该类,则由子类加载器加载该类。

双亲委派机制可以防止类加载器重复加载相同的类。它还确保了类的安全性。因为父类加载器加载的类是系统类或扩展类,这些类都是安全的。子类加载器加载的类是用户自定义的类,这些类可能不安全。因此,双亲委派机制可以防止不安全的类被加载到 JVM 中。

## 总结

类加载是 Java 虚拟机中一个重要的过程。类加载器负责寻找和加载类文件,并将其转换成 JVM 可以执行的字节码。类加载过程可以分为查找类文件、加载类文件、链接类和初始化类几个步骤。双亲委派机制是 Java 类加载器的一种机制。双亲委派机制可以防止类加载器重复加载相同的类,并确保了类的安全性。