问答题692/1053什么是双亲委派机制?

难度:
2021-11-02 创建

参考答案:

双亲委派机制(Parent-Delegation Model)是 Java 类加载机制中的一个重要设计原则。它的主要思想是,当类加载器需要加载一个类时,它不会直接加载该类,而是先将这个请求委派给其父类加载器。如果父类加载器无法加载该类,才会由当前加载器尝试加载。这个机制的核心目的是确保 Java 核心类库(如 java.lang 包中的类)始终由系统类加载器加载,从而避免类冲突。

双亲委派机制的工作原理

Java 的类加载器是以一种树形结构组织的,通常每个类加载器都有一个父类加载器。在双亲委派机制中,类加载器会先将类加载请求交给父类加载器,父类加载器会继续向上委派,直到请求被委派到最顶层的 引导类加载器(Bootstrap ClassLoader)。

类加载流程

假设我们有一个自定义的类加载器 MyClassLoader,它的父加载器是 ClassLoader(也可以是 Bootstrap ClassLoader)。当我们请求加载一个类时,过程如下:

  1. MyClassLoader 会首先将加载请求委派给它的父类加载器。
  2. 父加载器会继续将请求委派给它的父加载器,直到请求被引导类加载器(Bootstrap ClassLoader)处理。
  3. 如果引导类加载器无法加载该类,它会返回失败。
  4. 如果父加载器成功加载了该类,就直接返回加载的类。
  5. 如果父加载器都不能加载该类,当前加载器会尝试加载类。

双亲委派机制的优点

  1. 避免类冲突:通过遵循双亲委派规则,Java 核心类库(如 java.lang)总是由引导类加载器加载,避免了与用户定义类库的冲突。
  2. 类加载的一致性:核心类(如 StringObject)始终由系统加载,确保了这些类在 JVM 中的唯一性。
  3. 提升安全性:防止恶意代码通过自定义类加载器加载核心类,保护了 JDK 和 JVM 的稳定性。

双亲委派机制的例子

在 Java 中,ClassLoader 是所有类加载器的父类。常见的类加载器有:

  • Bootstrap ClassLoader:负责加载 JDK 核心库中的类,例如 java.lang.*
  • Extension ClassLoader:负责加载 JDK 的扩展库(如 lib/ext 目录中的类)。
  • System ClassLoader(也叫 Application ClassLoader):加载应用程序的类路径中的类。

当我们请求加载一个类时,系统会按照以下顺序查找:

  1. 先由 System ClassLoader 尝试加载该类。
  2. 如果 System ClassLoader 加载失败,委派给 Extension ClassLoader
  3. 如果 Extension ClassLoader 也无法加载,则委派给 Bootstrap ClassLoader

打破双亲委派机制

虽然双亲委派机制有很多优点,但在某些情况下,可能需要打破该机制。举例来说:

  • Tomcat:Tomcat 会为每个 Web 应用创建独立的类加载器,使得 Web 应用可以加载自己的类库,而不直接委派给父加载器(如 CatalinaClassLoader)。
  • OSGi:OSGi 框架为每个模块(Bundle)创建独立的类加载器,使得每个模块有自己的类加载空间,可以避免类的冲突。

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