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

文章目录

  • 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.mzph.cn/news/580536.shtml

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

相关文章

Grafana 配置告警

配置告警 配置告警 1. Grafana 配置文件配置 #################################### SMTP / Emailing ########################## [smtp] enabled true host smtp.qq.com:587 user 9**qq.com # If the password contains # or ; you have to wrap it with triple quotes…

智能优化算法应用:基于白鲸算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于白鲸算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于白鲸算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.白鲸算法4.实验参数设定5.算法结果6.参考文献7.MA…

vue3+elementPlus+cascader动态加载封装自定义组件+v-model指令实现父子通信

文章目录 select普通操作 &#xff08;1&#xff09;cascader操作&#xff08;2&#xff09; select普通操作 &#xff08;1&#xff09; 搜索条件需求&#xff1a;接口入参需要houseId&#xff0c;但是要先选择完楼栋&#xff0c;再选择单元&#xff0c;最后选择房屋 如图&a…

【C#】.net core 6.0 依赖注入生命周期

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 对于.net core而言&#xff0c;依赖注入生命周期有三种瞬态&#xff08;Transient&#xff09;、作用域&#xff08;Scoped&#xff09;和单例&#xff08;Singleton&#xff09;&#xf…

数据结构-如何实现一个队列?逐步解析与代码示例(超详细)

文章目录 前言1.队列的基本概念2.链表与数组实现队列的区别2.1数据存储结构2.2性能2.3内存使用 3.为什么选择链表实现队列&#xff1f;4.结构定义函数声明 5.核心操作5.1初始化 (QInit)5.2销毁 (QDestroy)5.3入队 (QPush)5.4出队 (QPop) 6.队列的查询操作6.1队首元素 (QueueFro…

如何将语音版大模型AI接入自己的项目里(语音ChatGPT)

如何将语音版大模型AI接入自己的项目里语音ChatGPT 一、语音版大模型AI二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例5、智能生成API代码 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、语音版大模型AI 基于阿里通义千问、百…

分享5款实用的小工具,提升你的工作效率

​ 工作中&#xff0c;简单而实用的小工具能够为我们带来事半功倍的效果。这五款工具可能是你工作效率提升的关键。 1.云存储——Dropbox ​ Dropbox是一款流行的云存储服务&#xff0c;可以让你在不同的设备上同步和访问你的文件。你可以将你的文件上传到Dropbox的服务器上&…

绝缘电阻测试仪的测量范围有多少?它的测量方法是什么?

绝缘电阻测试仪广泛应用于设备检测和故障排除。它广泛应用于电力检测行业。甚至可以说&#xff0c;电力设备离不开绝缘电阻测试仪设备。对于许多经验丰富的电力测试工人来说&#xff0c;绝缘电阻测试仪的常规测量范围和方法应该非常清楚。在本文中&#xff0c;我们将向一些新的…

学之思开源考试系统是一款 java + vue 的前后端分离的考试系统

学生系统功能 模块介绍登录用户名、密码注册年级、用户名、密码任务中心管理员发布的年级任务&#xff0c;每个学生只能做一次考试题干支持文本、图片、数学公式、表格等&#xff0c;学生答题支持&#xff1a;文本固定试卷可重复练习、自行批改的试卷时段试卷在时间限制内&…

关于chatglm3 function calling的理解

ChatGLM3-6B开源了工具调用&#xff0c;好奇他是怎么实现的&#xff0c;所以写了这个文章记录。 一、测试官方的示例 官方给的示例很简单&#xff0c;只不过给的两个函数 track 和 text-to-speech 没有具体的实现&#xff0c;模型的输出也只是给出了需要调用的函数名和参数。剩…

【C语言】指针详解(四)

目录 1.assert断言 2.指针的使用和传址调用 2.1strlen的模拟使用 2.2传值调用和传址调用 1.assert断言 assert.h头文件定义了宏 assert()&#xff0c;用于在运行时确保程序符合指定条件&#xff0c;如果不符合&#xff0c;就报错终止运行。这个宏常常被称为“断言”。 例如…

多模态——CLIP:Contrastive Language-Image Pre-training解读

前言 随着人工智能技术的不断进步&#xff0c;多模态成为备受瞩目的研究方向。多模态技术旨在融合不同类型的数据和信息&#xff0c;以实现更准确、高效的人工智能应用。有学者认为它代表了所有模型发展的最终趋势。这类模型旨在接受多种不同的输入方式&#xff0c;例如图像、…

OpenStack搭建和部署

Centos官网qcow2镜像修改root账号密码&#xff0c;开启ssh等 wget http://172.16.20.10/vmtemplate/KVM/wangrui/Debian/debian-10.2.0-openstack-amd64.qcow2 一、查看镜像文件信息 [debian-10.2-cloud] nameDebian 10.2.0 (Buster) Cloud osinfodebian10 archx86_64 fi…

Linux Debian12使用podman安装upload-labs靶场环境

一、upload-labs简介 PHP语言编写&#xff0c;持续收集渗透测试和CTF中针对文件上传漏洞的靶场&#xff0c;总共21关&#xff0c;每一关都包含着不同的上传绕过方式。 二、安装podman环境 Linux Debian系统如果没有安装podman容器环境&#xff0c;可以参考这篇文章先安装pod…

透过许战海矩阵洞察安记食品增长战略

引言&#xff1a;安记食品如果想实施增长战略&#xff0c;建议深耕招牌产品,走向全国市场,目前招牌产品咖哩和复合调味粉市场空间没有被全面释放出来,需要科学的产品战略作为支撑。安记食品选择功能性产品方向是正确的,但“功能性”需要一个大品类作为载体,牛奶,饮料是最大的载…

网站被恶意扫描怎么办(上WAF)

在网络安全领域&#xff0c;有一大类工具被广泛使用&#xff0c;且作用不可忽视&#xff0c;它就是网络安全扫描器。扫描器是一种专门设计用来评估计算机、网络或者应用中已知的弱点的计算机程序&#xff0c;但是很多人恶意使用&#xff0c;找到网站弱点进行攻击。 扫描器的种…

K8S理论

kubernetes&#xff1a;8个字母省略&#xff0c;就是k8s 自动部署自动扩展和管理容器化部署的应用程序的一个开源系统 k8s是负责自动化运维管理多个容器化程序的集群&#xff0c;是一个功能强大的容器编排工具 分布式和集群化的方式进行容器化管理 版本有1.15 .1.18 .1.20 …

问答区故意在结题前回答混赏金的狗

此贴专记录CSDN问答社区里面&#xff0c;一些回答者在临近结题时胡乱回答&#xff0c;只为分取结题赏金的人。 所有图片均为事实&#xff0c;绝无半点虚假。各位看官可以自行搜索问题题目或者通过查看此人回答求证 所有图片均为事实&#xff0c;绝无半点虚假。各位看官可以自行…

c语言中数据结构

一、结构体的由来 1. 数据类型的不足 C语言中&#xff0c;基本数据类型只有整型、字符型、浮点型等少数几种&#xff0c;无法满足复杂数据类型的需要。 2. 数组的限制 虽然数组可以存储多个同类型的数据&#xff0c;但是数组中的元素个数是固定的&#xff0c;无法动态地改变…

渗透测试——1.3计算机网络基础

一、黑客术语 1、肉鸡&#xff1a;被黑客攻击电脑&#xff0c;可以受黑客控制不被发现 2、端口&#xff08;port&#xff09;&#xff1a;数据传输的通道 3、弱口令&#xff1a;强度不高&#xff0c;容易被猜到的口令、密码 4、客户端&#xff1a;请求申请电脑&#xff08;…