问答题693/1053说下有哪些类加载器?

难度:
2021-11-02 创建

参考答案:

在 Java 中,类加载器(ClassLoader)是负责将类的字节码加载到 JVM 中的组件。类加载器有多种类型,每种类型负责加载不同的类或资源。以下是常见的几种类加载器:

1. 引导类加载器(Bootstrap ClassLoader)

  • 职责:引导类加载器负责加载 JDK 核心类库(如 java.lang.* 包中的类)。它是 Java 类加载器层次结构中的顶层加载器。
  • 实现Bootstrap ClassLoader 是用本地代码实现的,它没有直接的 Java 类表示,因此无法通过 ClassLoader API 访问。
  • 加载路径:从 JAVA_HOME/lib 目录下的 rt.jar(Java 运行时库)中加载类。
  • 特点:引导类加载器不遵循双亲委派模型,它负责加载最基本的类,是所有类加载器的父类。

2. 扩展类加载器(Extension ClassLoader)

  • 职责:扩展类加载器负责加载 JDK 扩展目录下的类库。通常是加载 lib/ext 目录中的 JAR 文件。
  • 实现Extension ClassLoader 是由 Java 自带的类加载器实现的,继承自 ClassLoader 类。
  • 加载路径:从 JAVA_HOME/lib/ext 目录或 java.ext.dirs 属性指定的路径中加载类。
  • 特点:它加载的类库是 JDK 扩展功能的一部分。

3. 系统类加载器(System ClassLoader) / 应用类加载器(Application ClassLoader)

  • 职责:系统类加载器负责加载应用程序类路径(classpath)下的类。它加载的是应用程序开发者提供的类。
  • 实现System ClassLoaderClassLoader 类的一个子类,通常由 JVM 启动时自动创建。
  • 加载路径:它从 CLASSPATH 环境变量指定的路径或启动时通过命令行指定的 -classpath-cp 参数加载类。
  • 特点:在通常情况下,系统类加载器是最常见的类加载器,负责加载用户应用程序的类。

4. Web 应用类加载器(WebappClassLoader)

  • 职责:Web 应用类加载器是专门为 Web 应用程序设计的类加载器。每个 Web 应用通常会有一个独立的 WebappClassLoader,用来加载 Web 应用内部的类。
  • 实现:在 Web 容器(如 Tomcat)中,Web 应用会有自己的类加载器,通常是 WebappClassLoader
  • 加载路径:加载应用程序的 WEB-INF/classes 目录中的类文件,以及 WEB-INF/lib 目录中的 JAR 包。
  • 特点:这种加载器通常实现了隔离,确保不同 Web 应用的类库不会相互干扰。

5. 自定义类加载器(Custom ClassLoader)

  • 职责:开发者可以继承 ClassLoader 类,自定义类加载器来实现特殊的类加载逻辑。例如,可以自定义类加载器从数据库或网络加载类,或修改类加载顺序。
  • 实现:通过继承 ClassLoader 类并重写 findClass() 方法来自定义类加载器的行为。
  • 特点:自定义类加载器通常用于解决复杂的加载需求,如动态加载、插件化系统等。

6. 模块类加载器(Module ClassLoader)

  • 职责:自 Java 9 起,引入了模块系统(Jigsaw),模块类加载器用于加载 Java 模块(即 module-info.java 定义的模块)。
  • 实现:模块系统通过 ModuleLayer 管理,ModuleClassLoader 加载模块中的类。
  • 特点:模块类加载器支持模块化开发,可以将不同的模块加载到不同的类加载器中,提供更细粒度的类加载控制。

类加载器的层次结构

Java 的类加载器遵循一个层次结构,通常是从下往上委派加载类。每个类加载器都有一个父加载器,遵循双亲委派模型:

Bootstrap ClassLoader
        |
   Extension ClassLoader
        |
System ClassLoader (Application ClassLoader)
        |
Webapp ClassLoader (Web Applications)

最近更新时间:2024-12-02