双亲委派机制 详解(手画详图,更快速的理解)

简介: 双亲委派机制 详解(手画详图,更快速的理解)

微信截图_20220523201504.png

受多种情况的影响,又开始看JVM 方面的知识。


1、Java 实在过于内卷,没法不往深了学。


2、面试题问的多,被迫学习。


3、纯粹的好奇。 很喜欢一句话:“八小时内谋生活,八小时外谋发展。


--- 望别日与君相见时,君已有所成。


共勉


封面地点:湖南--小城市邵阳


作者:博主    🤸‍♂️


@[TOC](双亲委派机制 详解(手画详图)面试高频 你值得拥有!!!)


一、概述


       双亲委派机制是当类加载器需要加载某一个.class字节码文件时,则首先会把这个任务委托给他的上级类加载器,递归这个操作,如果上级没有加载该.class文件,自己才会去加载这个.class。这是一种任务委派模式。


二、双亲委派机制原理


原理:


  • 如果一个类加载器收到了要加载某个类的请求,它要做的首要事情不是加载,而是将这个请求委托给父类的加载器去执行。


  • 如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;


  • 如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。


小故事


用一个小故事来加深大家的印象:


1、你看到餐桌上有个鸡腿,看到麻麻非常幸苦。你就说:麻麻你次这个鸡腿吧。麻麻又看到桌上的奶奶,就讲妈:次这个鸡腿补补身子吧。奶奶高兴的说:我媳妇孝顺啊,我今天也来尝尝这个孝顺味道的鸡腿啦。


2、你看到餐桌上有个鸡腿,看到麻麻非常幸苦。你就说:麻麻你次这个鸡腿吧。麻麻又看到桌上奶奶在,就讲妈:次这个鸡腿补补身子把。奶奶高兴的说:我媳妇有这个孝顺心就好了,你每天上班次外卖,对身体不好,这个鸡腿给你次。麻麻拿到手上,又反手把鸡腿夹给我,讲:这个鸡腿还是得你次,你现在正在长身体,不补一补长不高。⛹️‍♂️

==这就是双亲委派机制,不知道看完这个餐桌小故事,大家有没有懂勒。==


图示:


微信截图_20220523201645.png


代码解释:


我在我自己的项目中创建了 一个java.lang 的包 ,然后创建了一个 String 类。

再准备一个测试类,引用这个String类。


微信截图_20220523201707.png


String 类 里面就一个静态代码块。


微信截图_20220523201729.png


代码可以运行,输出如下:


微信截图_20220523201753.png


并没有输出我的String 里面的static 静态代码块,证明使用的仍然是 jdk 自带的。


原因是什么呢?


一步一步分析。


我们自定义一个类,你要想加载的话,应该是用 Application ClassLoader(系统类加载器、应用程序加载器)进行加载。但是这个时候又牵扯到了 双亲委派机制。


1、当我们要加载这个自定义String时,


2、先是让应用程序加载器(Application ClassLoader)加载,但是发现它上面还有扩展类加载器(Extension ClassLoader)


3、接着委托给扩展类加载器(Extension ClassLoader),突然发现它上面还有Bootstrap ClassLoader (启动类加载器)


4、就又接着委托到了Bootstrap ClassLoader (启动类加载器)。启动加载器一看,这不是 java.lang 包下的吗,这是我的任务啊,急忙把他加载啦,然后成功返回。所以这里使用的 new String() 实际使用的还是 java 中 String。


这样子可以防止什么样问题的发生呢?


你想啊,你写了一个项目,里面用了Jdk 核心类,像String.java,Integer.java,Date.java这种核心类,如果这种核心类能够被随意更改,第一、这很有可能导致整个项目的崩溃,第二、会影响到Java 虚拟机的稳定性。


三、双亲委派机制作用


  • 确保Java核心类库的安全:所有的Java应用都至少会引用java.lang.Object类,也就是说在运行期,java.lang.Object类会被记载到Java虚拟机当中;如果这个加载过程是由Java应用自己的类加载器所完成的,那么可能会在JVM中存在多个版本的java.lang.Object类,而且这些类还是不兼容的、相互不可见的(因为命名空间的原因)。借助父亲委托机制,Java核心类库中的类的加载工作都是由启动类加载器来统一完成的,从而确保了Java应用所使用的都是同一个版本的Java核心类库,他们之间是互相兼容的。


  • 确保Java核心类库提供的类不会被自定义的类所替代


  • 不同的类加载器可以为相同名称(binary name)的类创建额外的命名空间。相同名称的类可以并存在Java虚拟机中,只需要用不同的类加载器来加他们即可,不同类加载器所加载的类是不兼容的,这就相当于在Java虚拟机内部创建了一个又一个相互隔离的Java类空间。


  • 防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。


自言自语


划水的一篇哈,我们都加油,放肆爱!!!


微信截图_20220523201923.png


让我们一起走到最后吧

共勉


目录
相关文章
|
6月前
|
Java 数据库连接
什么是双亲委派?如何打破双亲委派?
什么是双亲委派?如何打破双亲委派?
150 0
|
6月前
|
存储 Java 编译器
类加载机制和双亲委派机制
类加载机制和双亲委派机制
|
2天前
|
Java
类加载器和双亲委派机制
从父类加载器到子类加载器分别为: BootStrapClassLoader 加载路径为:JAVA_HOME/jre/lib ExtensionClassLoader 加载路径为:JAVA_HOME/jre/lib/ext ApplicationClassLoader 加载路径为:classpath 还有一个自定义类加载器
|
3月前
|
Java 编译器
什么是双亲委派机制?
什么是双亲委派机制?
231 59
|
3月前
|
前端开发 Java C++
双亲委派机制
这篇文章详细解释了Java中的双亲委派机制,包括其原理、类加载器的分类(启动类加载器、扩展类加载器、应用程序类加载器)以及它们之间的关系和作用。
|
6月前
|
Java
【JVM】双亲委派机制、打破双亲委派机制
【JVM】双亲委派机制、打破双亲委派机制
55 1
|
Java 关系型数据库 MySQL
双亲委派机制,懂吧~ 那什么情况下需要破坏它,知道吗?
双亲委派机制,懂吧~ 那什么情况下需要破坏它,知道吗?
100 0
|
Java 应用服务中间件 API
打破双亲委派机制
打破双亲委派机制
57 0
|
前端开发 安全 Java
双亲委派到底是个啥
双亲委派到底是个啥
38 0
|
前端开发 Java
05-说下类加载器和双亲委派机制
在明白了整个类从加载到初始化的过程,接下来我们有必要来说下类加载器的概念,因为实现上述过程是必须依靠加载器来实现的。
68 0
05-说下类加载器和双亲委派机制