interview
java-virtual-machine
什么是 Java 中的双亲委派模型

Java 虚拟机面试题, 什么是 Java 中的双亲委派模型?

Java 虚拟机面试题, 什么是 Java 中的双亲委派模型?

QA

Step 1

Q:: 什么是 Java 中的双亲委派模型?

A:: 双亲委派模型是一种类加载机制。在 Java 中,当一个类加载器加载某个类时,它首先不会自己尝试去加载,而是将这个请求委派给它的父类加载器,每一层的加载器都是如此,最终这个请求会到达顶层的启动类加载器。如果父加载器无法加载这个类(即找不到这个类),那么子加载器才会尝试自己加载。这样做的目的是为了确保 Java 的核心类库能够由系统的顶层类加载器统一加载,防止核心类库被篡改。

Step 2

Q:: 为什么要使用双亲委派模型?

A:: 双亲委派模型的主要作用是为了安全性。通过这种模型,核心的 Java 类库由最上层的类加载器加载,防止核心类库被篡改。比如,如果自定义类加载器不采用双亲委派模型,而直接加载核心类库的某些类,可能会导致类的功能被破坏,造成系统运行异常或安全问题。

Step 3

Q:: 双亲委派模型的具体工作流程是什么?

A:: 当我们加载一个类时,类加载器会先把这个请求交给父类加载器,依次向上直到根类加载器(Bootstrap ClassLoader)。如果父类加载器能够找到并加载这个类,则直接返回类的字节码。如果父类加载器无法加载该类,子类加载器才会尝试加载。这个机制确保了 Java 核心类库由系统提供的类加载器加载,不会被篡改或替换。

Step 4

Q:: 如何打破双亲委派模型?

A:: 虽然双亲委派模型是 Java 类加载机制的基础,但在某些情况下,我们可能需要打破这个模型,比如自定义类加载器。在自定义类加载器中,可以通过覆盖 loadClass 方法来实现自己的类加载逻辑,而不调用 super.loadClass 方法,直接加载自己想要的类。这种做法需要谨慎,因为它可能会带来安全隐患。

用途

在实际生产环境中,双亲委派模型的主要作用是保证 Java 核心类库的安全性和稳定性,防止核心类库被恶意替换或篡改。在设计和开发 Java 应用程序时,如果需要使用自定义类加载器,了解双亲委派模型是必要的。这尤其重要在大型分布式系统或插件化架构中,使用自定义类加载器加载第三方类库或插件时,开发者需要明确什么时候遵循、什么时候打破双亲委派模型,以平衡安全性和灵活性。面试中考察这一知识点,主要是为了确认候选人对 Java 类加载机制的理解,以及其在复杂应用场景中的实际运用能力。\n

相关问题

🦆
Java 类加载器的种类有哪些?

Java 中的类加载器主要有三种:启动类加载器(Bootstrap ClassLoader),扩展类加载器(Extension ClassLoader)和应用类加载器(Application ClassLoader)。启动类加载器是用来加载核心类库的,例如 rt.jar 包中的类;扩展类加载器负责加载扩展包中的类;应用类加载器则负责加载应用程序类路径下的类。这三者之间形成了一个类加载器的树状结构。

🦆
什么是自定义类加载器?

自定义类加载器是开发者自己编写的类加载器,通常用于在特定的场景下加载特定的类,比如从网络、数据库中加载类,或者加载加密的类文件。自定义类加载器需要继承 ClassLoader 类,并重写 findClass 方法来自定义类的加载逻辑。

🦆
类加载的过程包括哪些步骤?

Java 类的加载过程包括五个主要阶段:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和初始化(Initialization)。在加载阶段,类加载器读取字节码并生成 Class 对象;在验证阶段,确保类文件的正确性;在准备阶段,为类的静态变量分配内存并初始化默认值;在解析阶段,将类中的符号引用转换为直接引用;最后在初始化阶段,执行类的静态代码块,并初始化静态变量的值。

🦆
什么是类的热加载与卸载?

类的热加载是指在运行时重新加载某个类,通常用于应用程序的热更新。类的卸载是指将类从内存中卸载,这通常是在类不再被使用时由垃圾收集器自动进行的。在 Java 中,类的热加载与卸载通常通过自定义类加载器来实现。