大家好,我是孤焰。今天要谈一谈在面试过程中几乎被每个面试官都会提到的一个问题——java中双亲委派机制及作用?
由于我也是刚刚学习编程的小白,所以此篇博文将参考了多篇博文,最后总结而成。
1.什么是双亲委派机制
当某个类加载器需要加载某个.class
文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。
2.类加载器
2.1 什么是类加载器
类加载器是jre的一部分,负责动态将类添加到Java虚拟机。
2.2 类加载器的分类
类加载器分类:
- 启动类加载器
bootstrap classloader
:加载jre/lib/rt.jar
,只加载包名为java、javax、sun
等开头的类,使用c++
语言编写。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作 - 扩展类加载器
extension classloader
:加载jre/lib/ext/*.jar
,使用java
语言编写 - 应用程序类加载器(又名系统类加载器)
application classloader
(system classloader
):加载classpath上指定的类库
,使用java
语言编写 - 用户自定义类加载器
custom classloader
:加载指定路径的class文件
,使用java
语言编写
3.双亲委派机制
3.1 工作原理
1)如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;
2)如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;
3)如果父类加载器可以完成加载任务,就成功返回,倘若父类加载器无法完成此挤在任务,子加载器才会尝试自己去加载,这就是双亲委派模式。
3.2 委派机制流程图
4.双亲委派机制的作用
4.1 双亲委派机制的作用
- 防止重复加载同一个
.class
。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。 - 保证核心
.class
不能被篡改。通过委托方式,不会去篡改核心.class
,即使篡改也不会去加载,即使加载也不会是同一个.class
对象了。不同的加载器加载同一个.class
也不是同一个Class
对象。这样保证了Class
执行安全。
4.2 举例
有的小伙伴可能不明白第2点作用,下面将举例说明(引用尚硅谷课堂中的案例):
大家都知道我们在创建包的时候不能创建名字为java的包,但为了举例我故意创建java.lang包并在此包下创建一个名字为String的类,如下图:
在此时当执行main方法的时候,会出现如下问题:
可想而知,idea根据包名一层一层的向上请求,在请求 bootstrap classloader
加载器的时候, bootstrap classloader
发现自己可以加载java.lang包下的类,所以对类库中的String进行了加载,但是类库中的String类并没有main方法,所以抛出了上述异常。
4.3 总结
由上述例子得知,双亲委派机制很好的防止了代码编写者对类中已有的类进行篡改,系统类库中的核心类由bootstrap classloader
加载器进行加载。
5.最后
都看到最后了,求求大家点个赞再走吧!你的支持是博主创作的最大动力。