文章目录
- 双亲委派机制
- 简介
- 案例:自底向上查找
- 案例:自顶向下加载
- 案例:C类在当前程序的classpath中
- 双亲委派机制的作用
- 如何指定加载类的类加载器?
- 面试题
- 如果一个类重复出现在三个类加载器的加载位置,应该由谁来加载?
- String类能覆盖吗,在自己的项目中去创建一个java.lang.String类,会被加载吗?
- 为什么叫双亲委派机制,加载器不是只有父亲吗?
- **类的双亲委派机制是什么?**
- 如果三个类加载器都都无法成功加载类会怎么样?
- 拓展类加载器的parent是null,那向上查找的时候,如何拿到启动类加载器?
- Arthas中类加载器相关功能
- 文章说明
双亲委派机制
简介
双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会自底向上查找是否加载过,如果没有加载过,再由顶向下进行加载。
每个Java实现的类加载器中保存了一个成员变量叫"父”(Parent)类加载器。自底向上查找是否加载过,再由顶向下进行加载,避免了核心类被应用程序重写并覆盖的问题,提升了安全性。
【详细流程】
每个类加载器都有一个父类加载器,父类加载器的关系如下,启动类加载器没有父类加载器
拓展类加载器的parent是null,因为无法获取c++源码的启动类加载器
在类加载的过程中,每个类加载器都会先检查是否已经加载了该类,如果已经加载则直接返回,否则会将加载请求委派给父类加载器。
案例:自底向上查找
比如com.itheima.my.A假设在启动类加载器的加载目录中,而应用程序类加载器接到了加载类的任务。
1、应用程序类加载器首先判断自己加载过没有,没有加载过就交给父类加载器 - 扩展类加载器。
2、扩展类加载器也没加载过,交给他的父类加载器 - 启动类加载器。
3、启动类加载器发现已经加载过,直接返回。
案例:自顶向下加载
B类在扩展类加载器加载路径中,同样应用程序类加载器接到了加载任务,按照案例1中的方式一层一层向上查找,发现都没有加载过。那么启动类加载器会首先尝试加载。它发现这类不在它的加载目录中,向下传递给扩展类加载器(父加载器加载不了,传给子类,让其加载)。
扩展类加载器发现这个类在它加载路径中,加载成功并返回。
如果第二次再接收到加载任务,同样地向上查找。扩展类加载器发现已经加载过,就可以返回了。
案例:C类在当前程序的classpath中
启动类加载器、拓展类加载器都不能加载,只能向下找到应用程序加载器来加载
双亲委派机制的作用
解决一个类到底由哪个类加载器加载的问题。
保证类加载的安全性
:通过双亲委派机制避免恶意代码替换JDK中的核心类库,比如java.lang.String,确保核心类库的完整性和安全性。避免重复加载
:双亲委派机制让一个类只被一个类加载器加载,避免同一个类被多次加载。
如何指定加载类的类加载器?
在Java中如何使用代码的方式去主动加载一个类呢?
- 方式1:使用Class.forName方法,使用当前类的类加载器去加载指定的类。
- 方式2:获取到类加载器,通过类加载器的loadClass方法指定某个类加载器加载。
例如:
面试题
如果一个类重复出现在三个类加载器的加载位置,应该由谁来加载?
启动类加载器加载,根据双亲委派机制,它的优先级是最高的
String类能覆盖吗,在自己的项目中去创建一个java.lang.String类,会被加载吗?
不能,因为启动类加载器已经加载过String类,会返回启动类加载器加载在rt.jar包中的String类。双亲委派机制,避免核心类被覆盖,保证代码的安全性
为什么叫双亲委派机制,加载器不是只有父亲吗?
其实是parent翻译过来,翻译成了双亲
类的双亲委派机制是什么?
- 当一个类加载器去加载某个类的时候,会自底向上查找是否加载过,如果加载过就直接返回,如果一直到最顶层的类加载器都没有加载,再由顶向下进行加载。
- 应用程序类加载器的父类加载器是扩展类加载器,扩展类加载器的父类加载器是启动类加载器。
- 双亲委派机制的好处有两点:
- 第一是避免恶意代码替换JDK中的核心类库,比如java.lang.String,确保核心类库的完整性和安全性。
- 第二是避免一个类重复地被加载。
如果三个类加载器都都无法成功加载类会怎么样?
会报类无法找到错误,可以尝试加载一个不存在的类看看
拓展类加载器的parent是null,那向上查找的时候,如何拿到启动类加载器?
当扩展类加载器需要委托给其父加载器加载类时,它并不会像普通Java类加载器那样通过调用getParent()
方法来获取父加载器的引用并调用父加载器的加载方法。相反,它会使用一种特殊的方式间接与启动类加载器交互,这个过程是JVM内部实现的,并不暴露给Java程序直接操作。
Arthas中类加载器相关功能
查看当前进程的父子类加载器关系
文章说明
该文章是本人学习 黑马程序员 的学习笔记,文章中大部分内容来源于 黑马程序员 的视频黑马程序员JVM虚拟机入门到实战全套视频教程,java大厂面试必会的jvm一套搞定(丰富的实战案例及最热面试题),也有部分内容来自于自己的思考,发布文章是想帮助其他学习的人更方便地整理自己的笔记或者直接通过文章学习相关知识,如有侵权请联系删除,最后对 黑马程序员 的优质课程表示感谢。