【基础篇】五、类的双亲委派机制

文章目录

  • 1、双亲委派机制
  • 2、Java代码中去主动加载一个类
  • 3、“父”加载器
  • 4、Q & A
  • 5、打破双亲委派机制

1、双亲委派机制

JVM中有多个类加载器,某个类A,到底该由谁去加载 ⇒ 双亲委派机制

该机制的作用:

  • 保证类加载的安全性:避免用户自定义一个java.lang.String恶意替换JDK的核心类库里的String类
  • 避免重复加载:避免同一个类被多次加载,提高效率

该机制的内容是,当一个类加载接收到加载类的任务时:

  • 自底向上查找是否已经被父加载器加载过,有则直接返回
  • 若没被加载,再自顶向下进行加载
    在这里插入图片描述

从下往上查找是否被加载过,没有则委派给父类加载器:

在这里插入图片描述

若全都没有被加载过,则从启动类加载器开始加载,当要加载的类不在启动类加载器的加载范围时,往下走到扩展类加载器,以此类推。

这种机制的好处是:控制了加载优先级,一个类优先去由启动类加载器去尝试加载

2、Java代码中去主动加载一个类


方式一:Class.forName( ),使用当前类的加载器去加载

方式二:classLoader对象.loadClass( ),使用指定的加载器对象去加载

public class LoaderTest {public static void main(String[] args) throws ClassNotFoundException, IOException {//自己写的类ClassLoader classLoader = TestJvm.class.getClassLoader();System.out.println(classLoader);//尝试用应用类加载器去加载String类Class<?> clazz = classLoader.loadClass("java.lang.String");System.out.println(clazz.getClassLoader());}
}

运行结果的null,即说明还是用的启动类加载器加载的String,体现了双亲委派机制:

在这里插入图片描述

3、“父”加载器

双亲委派机制里的父加载器,这个父,不是Java继承的那个父,只是类加载器对象中有个成员变量叫parent,是上级关系,不是有继承关系。

在这里插入图片描述

应用程序加载器的parent属性为扩展类加载器,而扩展类加载器的parent为null,这是由于Java代码中没法拿到启动类加载器的对象,因此赋值为null。启动类加载器用c++编写,没有父加载器

在这里插入图片描述

Arthas工具查看类加载器的父子关系:

classloader -t

在这里插入图片描述

4、Q & A

Q:双亲委派机制?

A:

  • 某个类加载器加载一个类时,向上查找、向下加载,有加载过则直接返回,到顶层类加载器也没被加载过,再向下加载
  • 应用程序类加载器的父加载器是扩展类加载器,扩展类加载器的父加载器是启动类加载器,启动类加载器无父加载器
  • 好处是避免恶意替换JDK核心类以及避免重复加载
Q:如果一个类被三种类加载器都无法加载?

A:返回ClassNotFountException

Q:一个类重复出现在三个类加载器的范围,由谁来加载

A:由启动类加载器,其优先级最高

Q:自己的项目新建一个java.lang.String,能否被加载

A:否,会由启动类加载器加载JDK/rt.jar包下的String类

5、打破双亲委派机制

该机制下,向上查找、向下加载,如果有两个全类名相同的类,但内容不同,就只会有一个被加载。如Tomcat上运行多个web应用,其中两个web应用里都有com.plat.MyServlet类,则双亲委派机制下,后者不会被加载:

在这里插入图片描述

Tomcat使用了自定义类加载器来实现应用之间类的隔离。每一个应用会有一个独立的类加载器加载对应的类。

在这里插入图片描述

想打破类的双亲委派机制,方法有:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/305664.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一招搞定找不到vcruntime140_1.dll无法继续执行此代码

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“找不到指定的模块”或“无法加载某某.dll文件”。而其中一个常见的问题就是vcruntime140_1.dll丢失。那么&#xff0c;vcruntime140_1.dll到底是什么&#xff1f;为什么会出现丢失的情…

django之drf框架(排序、过滤、分页、异常处理)

排序 排序的快速使用 1.必须是继承GenericAPIView及其子类才能是用排序 导入OrderingFilter类&#xff0c;from rest_framework.filters import OrderingFilter 2.在类中配置类属性 filter_backends[OrderingFilter] 3.类中写属性 ordering_fields [price,id] # 必须是表的…

【快速全面掌握 WAMPServer】04.人生初体验

网管小贾 / sysadm.cc 我们在前面的教程中为小伙伴们详细地介绍了 WampServer 的安装方法&#xff0c;相信大家对于如何安装应该已经有了一个比较完全的掌握。 在完全掌握安装方法之后&#xff0c;我们还可以更加便捷地使用我为大家提供的一键安装批处理程序来快速搞定安装部署…

Vue 问题解决

一、问题&#xff1a;TypeError: (0 , _message.default) is not a function 当没有default时,在其他页面import引入的时&#xff0c;必须加{}。 二、问题&#xff1a;Vue前端页面的表格数据总是一行一行的显示 使用Async/Await来解决前端数据一行一行显示的问题。可以将获取部…

磁盘管理 :逻辑卷、磁盘配额

一 LVM可操作的对象&#xff1a;①完成的磁盘 ②完整的分区 PV 物理卷 VG 卷组 LV 逻辑卷 二 LVM逻辑卷管理的命令 三 建立LVM逻辑卷管理 虚拟设置-->一致下一步就行-->确认 echo "- - -" > /sys/class/scsi_host/host0/scan;echo "- -…

如何将弹性公网IP绑定到负载均衡CLB

创建的CLB实例为私网类型&#xff0c;没有公网IP&#xff0c;无法通过公网访问&#xff0c;如果需要让其网站能够通过公网访问&#xff0c;只需要绑定前面创建的EIP即可。 第一步 如果弹性公网IP已经绑定了资源&#xff0c;需要先解绑 第二步 将私网CLB实例绑定到弹性公网IP …

CASAIM与东风日产达成治具开发设计与制造战略合作,共同推进3D打印和三维测量技术在汽车制造中的应用开发

CASAIM与东风日产是长期战略合作伙伴&#xff0c;近期&#xff0c;CASAIM中标东风日产的治具开发设计与制造项目&#xff0c;与东风日产在生产工具和工装治具达成战略合作&#xff0c;充分发挥双方技术优势&#xff0c;共同推进3D打印和三维测量技术在汽车制造中的应用开发和合…

用Python做生信分析--环境配置以哦见状

文章目录 pandas 模块安装方法查看pandas是否安装好&#xff0c;以及版本的查看 numpy 模块安装方法查看numpy是否安装好&#xff0c;以及版本的查看 biopython模块安装方法查看biopython是否安装好&#xff0c;以及版本的查看 jupyter-notebook&#xff08;我比较喜欢用这个写…

AI产品经理 - 技术课-必须懂的技术

一、AI数据流向技术 1.实时智能调度 二、常用的算法 3.案例&#xff1a;自然语言生成NLG&语音识别 4.虚拟现实&机器学习平台 5.深度学习 5.决策管理系统&生物特征识别技术 6.机器人流程自动化& NLP&#xff08;自然语言处理&#xff09;

Springboot使用log4j2日志框架

文章目录 1.pom.xml引入依赖2.配置文件引入log4j2的配置文件3.导入log4j2配置文件4.通过Slf4j注解来使用log.info()等最后 1.pom.xml引入依赖 提示&#xff1a;lombok用于Slf4j注解 <dependency><groupId>org.springframework.boot</groupId><artifactId&…

ROS MoveIt!

MoveIt!是一个用于ROS的开源运动规划库&#xff0c;提供多种功能&#xff0c;包括用于运动规划的快速逆运动学分析、用于操纵的高级算法、机械手控制、动力学、控制器和运动规划。&#xff08;通过提供一个GUI来协助MoveIt!所需的各种设置&#xff0c;它允许使用RViz进行视觉反…

从 Linux Crontab 到 K8s CronJob,定时任务正在经历怎样的变革

作者&#xff1a;黄晓萌(学仁) 背景 Job 表示短周期的作业&#xff0c;定时 Job 表示按照预定的时间运行Job&#xff0c;或者按照某一频率周期性的运行 Job。比如&#xff1a; 许多传统企业使用 Linux 自带的 crontab 来做定时任务的方案&#xff0c;该方案非常简单&#xff…