简单案例验证说明 双亲委派机制

双亲委派介绍

双亲委派机制(Parent Delegation Mechanism)是Java中的一种类加载机制。在Java中,类加载器负责加载类的字节码并创建对应的Class对象。双亲委派机制是指当一个类加载器收到类加载请求时,它会先将该请求委派给它的父类加载器去尝试加载。只有当父类加载器无法加载该类时,子类加载器才会尝试加载。

这种机制的设计目的是为了保证类的加载是有序的,避免重复加载同一个类。Java中的类加载器形成了一个层次结构,根加载器(Bootstrap ClassLoader)位于最顶层,它负责加载Java核心类库。其他加载器如扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader)都有各自的加载范围和职责。通过双亲委派机制,可以确保类在被加载时,先从上层的加载器开始查找,逐级向下,直到找到所需的类或者无法找到为止。

这种机制的好处是可以避免类的重复加载,提高了类加载的效率和安全性。同时,它也为Java提供了一种扩展机制,允许开发人员自定义类加载器,实现特定的加载策略。

类加载器介绍

上面说到了几个类加载器,小伙伴们可能有点懵,我简单介绍下3个最重要的类加载器。

  • Bootstrap classLoader:这个加载器是最顶层的加载器,主要加载核心类库,%JRE_HOME%\lib下的jar包,在jdk源码中其实是找不到这个类的,它是使用C/C++语言实现的,本身是虚拟机的一部分。不过能够在ClassLoader类中调用findBootstrapClass(String name)方法取得这个类,不过该方法也是native方法,看不到具体实现。
  • ExtClassLoader:这个是扩展的类加载器,加载目录%JRE_HOME%\lib\ext目录下的jar包。需要注意的是Bootstrap classLoader并不是ExtClassLoader严格意义上的父加载器,ExtClassLoader实例中有个变量是ClassLoader parent,这个变量的值是null。当ClassLoader执行loadClass(String name, boolean resolve)方法时,检查到parent值是null,然后会执行findBootstrapClassOrNull(String name)找到Bootstrap classLoader
  • AppClassLoader:这个类加载当前应用的classpath的所有类。它的ClassLoader parentExtClassLoaderAppClassLoaderExtClassLoader最顶层的父类是ClassLoaderClassLoader是个抽象类。

类加载流程

类的加载流程用一句话简单说就是向上委托,向下查找加载。流程如下:
在这里插入图片描述

测试Demo

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

再准备一个测试类,使用这个String类创建对象。

 

运行结果:

并没有输出我的String 里面的static 静态代码块和构造函数中的内容。

并没有输出我的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。

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

  1. 避免类的重复加载:当一个类需要被加载时,JVM首先会委派给父类加载器进行加载,只有当父类加载器无法加载该类时,才会由当前类加载器进行加载。这样可以有效避免类的重复加载,节省了内存空间。

  2. 确保类的安全性:通过双亲委派机制,JVM可以对类加载的层次结构进行管理和控制,从而确保类的安全性。只有由受信任的类加载器加载的类才能被使用,防止恶意类的加载和执行。

  3. 提高代码的稳定性和可靠性:通过双亲委派机制,JVM可以保证核心类库的一致性和稳定性。当核心类库中的类被加载时,始终使用同一个类加载器进行加载,避免了不同类加载器加载同一个类的情况,从而保证了代码的稳定性和可靠性。

  4. 支持类加载的定制化:通过自定义类加载器可以实现对类加载的定制化,根据不同的需求加载不同的类。双亲委派机制使得自定义类加载器可以在委派链的某个节点进行加载,从而实现对加载过程的控制和定制。

总结

最后总结一下,这种设计有个好处是,如果有人想替换系统级别的类:String.java。篡改它的实现,在这种机制下这些系统的类已经被Bootstrap classLoader加载过了(为什么?因为当一个类需要加载的时候,最先去尝试加载的就是BootstrapClassLoader),所以其他类加载器并没有机会再去加载,从一定程度上防止了危险代码的植入。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

aysnc-await的用法

aysnc-await是promise的一种特殊语法,它可以更简洁的得到promise aysnc function aysnc 放在函数前定义函数,它规定了这个函数的返回值一定为promise, // 通过new新建一个promise(旧) // let p new Promise(function(resolve,reject){ //…

可搜索加密:保护隐私的搜索技术

在信息化、数字化快速发展的今天,数据的安全性和隐私性已成为公众关注的焦点。随着云计算、大数据等技术的广泛应用,数据共享与协同工作日益普遍,但如何在确保数据安全性的前提下,实现数据的快速、高效检索,成为了一个…

MySQL中explain的用法

执行结果各字段的含义 EXPLAIN SQL语句 如: EXPLAIN SELECT * FROM test 执行结果: 列名描述id在一个大的查询语句中每个SELECT关键字都对应一个 唯一的idselect_typeSELECT关键字对应的那个查询的类型table表名partitions匹配的分区信息type针对单表…

LLama的激活函数SwiGLU 解释

目录 Swish激活函数 1. Swish函数公式 LLaMA模型中的激活函数 1. SwiGLU激活函数 2. SwiGLU激活函数的表达式 3. SwiGLU激活函数的优势 Swish激活函数 Swish是一种激活函数,其计算公式如下: 1. Swish函数公式 Swish(x) x * sigmoid(x) 其中&am…

基于CANoe从零创建以太网诊断工程(2)—— TCP/IP Stack 配置的三种选项

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

Confluence 快捷键大揭秘:提高效率的小窍门

使用 Confluence 快捷键的好处有: 1.提高工作效率; 2.更流畅地进行编辑、导航和管理操作; 3.减少误操作; 4.展现专业水平。 更多精彩内容: 成为 Jira 大师:效率达人的必备秘诀 Jira Cloud 项目管理专栏 PMO…

怎样把PDF分割成多个文件?有哪些方法可以分割PDF文件?这几个方法成功率很高!

一,引言 PDF分割,即将一个完整的PDF文档拆分为多个较小的部分,是许多用户在处理 PDF文件时经常需要执行的操作。无论是为了单独提取某个章节、创建电子书章节、还是为了在多个设备间轻松共享,PDF分割都显得非常实用。本文将详细介…

AI大模型语音实时对话聊天机器人实现:ollama、funasr;支持语音实时语音打断;回音消除噪声抑制

ASR:funasr(1.0.19) LLM:ollama(Qwen) TTS(edge_tts) 支持语音实时语音打断:这是通过子进程的控制创建与杀掉,这里是通过有人再次说话就打断tts 回音消除噪声抑制:喇叭的tts播报影响到麦克风的识别了,播报的声音被错误的识别;这里可以jd买个回音消除的麦克风设备;或者有…

python 10实验

实验内容: 使用线性回归算法预测儿童身高 实验目的: 理解线性回归算法的原理,了解线性回归算法适用的问题类型,能够使用线性回归算法解决问题 实验内容: 一个人的身高除了随年龄变大而增长以外,在一定程…

revit\navisworks各种安装问题

You have entered a nonvalid serial number ,怎么都不给你一个机会输出序列号,怎么办? step1: C:\Program Files (x86)\Common Files\Autodesk Shared\AdskLicensing目录下找到uninstall.exe,右键管理员模式运行,会…

动态活码二维码怎么制作?在线二维码生成器的使用技巧

二维码是如何生成的呢?现在二维码与我们的工作和生活息息相关,越来越多的场景都会有不同类型的二维码,比如常见的有视频、图片、文件、问卷、文本等等类型的内容。面对不同用途需求来制作二维码来为其他人提供内容展示,提升用户获…

Chisel 入门(2)运算符

Chisel 入门(2) 运算符 逻辑运算符 ChiselExplanationwidth!x逻辑非1x && y逻辑与1x||y逻辑或1 位操作运算符 ChiselExplanationwidthin Verilog~x位反w(x)~ signal_xx & y位与max(w(x), w(y))signal_x & signal_yx | y位或max(w(x), w(y))signal_x | sign…

Oracle数据库的AI能力分析,释放企业数据价值

解锁Oracle数据库的AI潜力 Oracle数据库提供了一系列的AI能力,旨在帮助企业和开发者更高效地利用人工智能技术。以下是Oracle数据库AI能力的一些关键点:1. AI向量相似性搜索:Oracle Database 23c引入了AI Vector Search功能,该功…

基于B2C的网上拍卖系统——秒杀与竞价

点击下载源码和论文https://download.csdn.net/download/liuhaikang/89222887 课题背景及意义 随着网络的进一步普及和电子商务的高速发展,越来越多的人们开始在网络中寻求方便。网上网物具备了省时、省事、省心、高效等特点,从而受到越来越多人的欢迎。…

SpringCloud系列(16)--将服务提供者Provider注册进Zookeeper

前言:在上一章节中我们说明了一些关于Eureka自我保护模式,而且自上一章节起关于Eureka的知识已经讲的差不多了,不过因为Eureka已经停更了,为了安全考虑,我们要用还在更新维护的注册中心来取代Eureka,而本章…

C语言:复习

文章目录 思维导图数组和指针库函数的模拟实现判断大小端 最近知识学的差不多了,因此开始复习,本篇开始的是对于C语言的复习 思维导图 下面就依据下图,进行内容的整理 数组和指针 这个模块算是C语言中比较大的一个模块了,具体概…

Three.js——基础材质、深度材质、法向材质、面材质、朗伯材质、Phong材质、着色器材质、直线和虚线、联合材质

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

如何使用rdtsc和C/C++来测量运行时间(如何使用内联汇编和获取CPU的TSC时钟频率)

本文主要是一个实验和思维扩展,是一个初步的尝试,旨在研究一些时间测量实现和在 C/C 中内联汇编和汇编函数的使用方法。除非你有特殊用途,不然不要使用汇编指令来实现这个功能。在“扩展阅读”部分会列出了一些不需要内联汇编实现的方法。 写…

猫头虎分享已解决Bug || TypeError: Cannot read property ‘map‘ of undefined**

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

4.25 C高级

思维导图 作业 2.输入两个数,实现两个数的排序 3.输入一个数,计算是否是水仙花 if ((g*g*gs*s*sb*b*bnum)) then echo YES else echo no fi 4.输入一个成绩实现登记判断 90-100A 80-89B 70-79C 60-69D 0-59E