专业的JAVA编程教程与资源

网站首页 > java教程 正文

面试官:什么是java类加载当中的双亲委派?

temp10 2025-02-04 16:16:03 java教程 11 ℃ 0 评论

今天来分享一道关于java类加载方面的面试题:什么是双亲委派?

双亲委派的英文是parent delegation model,从真正的实现逻辑来看,正确的翻译应该是父委托模型。不管它叫什么,我们来先看看遇到这个问题的时候,应该怎么去回答呢?

面试官:什么是java类加载当中的双亲委派?

首先,简单说一下类的加载这样一个机制,就说我们自己写的java文件到最终运行,它必须要经过编译和类加载这两个阶段。编译的过程就是把点java文件编译成点class文件,类的加载过程,就是把点class文件加载到jvm的内存里面,装载完成以后会得到一个class对象,我们就可以使用new关键字来实例化这个对象。

而类的加载过程需要涉及到类加载器,JVM在运行的时候会产生3个类加载器,这3个类加载器组成了一个层级关系,每一个类加载器分别去加载不同作用范围的jar包。Bootrap ClassLoader主要是负责java核心类库的加载,也就是JDK_HOME/lib下面的一个rt.jar和resource.jar等等。Extension ClassLoader主要是负责JDK_HOME/lib/ext目录下的一个jar包和class文件,ApplicationClassLoader主要是负责当前应用里面classpath下面的所有jar包和类文件。除了系统自己提供的类加载器以外,还可以通过ClassLoad类来实现自定义加载器,去满足一些特殊的场景需求。

而所谓的父委托模型呢,就是按照类加载器的层级关系逐层进行委派。比如说当我们需要加载一个class文件的时候,首先会去把这个class文件的查询和加载,委派给父加载器去执行,如果父加载器都无法加载,那么再尝试自己来加的这个class。

这个设计的好处包含下述两点。

第一个是安全性,因为这种层级关系实际上代表的是一种优先级,也就是说所有的类加载优先要给到Boostrap ClassLoader,对于核心类库中的一些类,就没有办法被破坏。比如说自己写一个String,最终还是会交给启动类加载器,再加上每个类加载器的本身的作用范围,那么自己写的String,就没有办法去覆盖类库中的类。

第二个是可以避免重复加载导致程序混乱的一些问题,因为如果父加载器已经加载过了,那么子加载器就没有必要再去加载了。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表