Java双亲委派和类加载器

news2024/12/23 3:28:02

Java双亲委派和类加载器

  • Java类生命周期
  • 主要内容
  • 类加载器的分类
    • Bootstrap ClassLoader
    • 非Bootstrap ClassLoader
      • Extension ClassLoader
      • Application ClassLoader
      • User ClassLoader
  • 类加载的命名空间
    • 问题提出
    • 双亲委派机制
    • 问题解答
  • 破坏双亲委派
    • 破坏双亲委派-第一次
    • 破坏双亲委派-第二次
  • 思考题

Java类生命周期

Java类加载分为以下几个步骤:
在这里插入图片描述
只有加载步骤中的读取二进制流与初始化部分,能够被上层开发者,也就是大部分的Java程序员控制,而剩下的所有步骤,都是由JVM掌控,其中细节由JVM的开发人员处理,对上层开发者来说是个黑盒。

面向对象SOLID: 单一功能、开闭、里氏替换、接口隔离、依赖反转。

主要内容

在这里插入图片描述

类加载器的分类

类加载器的分类属于JVM规范,属于一种抽象的概念。各个不同的JVM实现方式是不一定一样的。

JVM规范中类加载器分为两大类,分为启动类加载器非启动类加载器

本文主要关注HotSpot虚拟机。
在这里插入图片描述

Bootstrap ClassLoader

Bootstrap ClassLoader是嵌套在JVM内部的,它主要用于加载java的核心类库。比如<JAVA_HOME>/lib下的jar包。或者是由启动参数来指定路径下的核心类库。

此外,为了安全性,Bootstrap ClassLoader只加载了包名在白名单中的文件。

非Bootstrap ClassLoader

Extension ClassLoader

是由内部类ext classloader来实现的。主要加载<JAVA_HOME>/lib/ext目录下或者是由系统变量指定的路径中的类库。

Extentsion ClassLoader希望加载的是Java API的拓展,是对Java类库的一些补充能力。

Application ClassLoader

是由内部类app classloader来实现的。主要加载classpath/java.class.path目录下或者是系统属性指定的路径中的类库。

Application ClassLoader希望加载的是上层程序员编写的一些代码以及一些第三方的类库。可以说程序员平时编写的代码都是由Application ClassLoader来加载的。

User ClassLoader

可以让用户获取任何地方的字节码,并对它们进行加载。这就印证了在Java类加载机制中,允许用户从各个渠道获取class文件的二进制流来进行加载的结论。

用户自定义的类加载器只需要继承java.lang.ClassLoader, 然后单独实现获取二进制流的逻辑。而后续的步骤必须让java.lang.ClassLoader中内置的逻辑来处理。用户无权进行重写和干涉。

类加载的命名空间

问题提出

1.不同的类加载器,除了读取二进制流的动作和范围不一样,后续的加载逻辑是否也不一样?
2. 遇到限定名一样的类,这么多类加载器会不会产生混乱?

JVM规范:每个类加载器都有属于自己的命名空间。

双亲委派机制

在这里插入图片描述
在被动的情况下,当一个类加载器收到加载请求,他不会首先自己去加载,而是传递给自己的父亲加载器。

这样所有的类都会首先传递到最上层的Bootstrap ClassLoader,只有父亲加载器无法完成加载,那么儿子加载器才会自己去尝试加载。

无法加载:根据类的限定名,类的加载器没有在自己负责的加载路径中找到该类。

问题解答

  1. 不同的类加载器,除了读取二进制流的动作和范围不一样,后续的加载逻辑是否也不一样?
    我们认为除了Bootstrap ClassLoader,所有的非Bootstrap ClassLoader都继承了
    java.lang.ClassLoader,都由这个类的defineClass进行后续处理。

  2. 遇到限定名一样的类,这么多类加载器会不会产生混乱?
    越核心的类库被越上层的类加载器加载,而某限定名的类一旦被加载过了,被动情况下,就
    不会再加载相同限定名的类。这样,就能够有效避免混乱。

破坏双亲委派

但是双亲委派模型并不是一个具有强约束力的模型,因为他存在设计权限。在大部分被动情况下,他是生效并且好用的。但在一些情况可以被主动破坏。

破坏双亲委派-第一次

在这里插入图片描述

破坏双亲委派-第二次

在这里插入图片描述
上层的BootstrapClassLoader对下层的Application ClassLoader进行了委派加载。

思考题

能不能自己写一个限定名为java.lang.Stringl的类,并在程序中调用它?
如果在项目中单纯定义一个java.lang.String类,那么根据双亲委派原则会加载源码中的String,自定义类无法加载报错。如果使用自定义加载器去加载自定义的String类也不行,JDK源码好像限制了"java"开头的类,也就是保护核心源码的安全机制,防止乱改核心源码。

参考资料:【JVM】Java双亲委派、类加载器这块算是玩明白了

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

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

相关文章

【MySQL】GROUP BY分组子句与联合查询的使用详解

目录 前篇都在这里喔~ MySQL的增删改查 MySQL数据库约束和聚合函数的使用 1.GROUP BY子句 练习表如下&#xff1a; 1.查询不包含董事长的平均工资 2.按照角色分组计算平均工资 3.过滤掉平均工资大于一万的角色 4.♥过滤数据♥ 2.联合查询 以下列表作为依据 1.内连接 …

(十二)rk3568 NPU 中部署自己训练的模型,(1)使用yolov5训练自己的数据集-环境搭建部分

rk3568中带有0.8T算力的NPU&#xff0c;可以完成一些轻量级的图像识别任务。 本文向零基础人员介绍从windows中搭建训练环境&#xff0c;模型训练、模型转换到rknn模型部署到电路板上全部过程。 rk3568npu支持caffe、darknet、onnx、pytorch、tensorflow等多种框架。 本人使用…

springboot+vue企业人事人力资源管理系统java公司员工出差考勤办公OA系统

“简易云”是这个系统的名字 &#xff08;6&#xff09;系统管理&#xff1a;主要下拉分为角色管理、菜单管理&#xff1b; 角色管理&#xff1a;此页面可对角色进行增删改查操作&#xff0c;可修改不同角色的权限&#xff1b; 菜单管理&#xff1a;此页面可配置系统可展示的菜…

linux学习记录 和文件系统相关的命令

记录过程&#xff0c;会有错误,硬链接与软链接哪里可能没有说清楚 文件,目录操作命令 pwd 获取当前处于哪个目录当中&#xff0c;返回的是绝对路径 [rootlocalhost home]# pwd /homecd cd 相对/绝对路径 切换目录的&#xff0c;change directory .代表当前目录 …代表上一级…

【C++学习】类和对象--对象特性(1)

构造函数和析构函数 对象的初始化和清理是两个非常重要的安全问题 一个对象或变量没有初始状态&#xff0c;对其使用后果是未知的 使用完一个对象或变量&#xff0c;没有及时清理&#xff0c;也会造成一定的安全问题 C利用构造函数和析构函数解决上述问题&#xff0c;这两个函数…

排序 Comparable 和 Comparator 区别所在

在 Java 中&#xff0c;Comparable 和Comparator 都是用来元素排序的&#xff0c;但是本质不用。我们从几点开始分析。 1.字面含义 Comparable 中文翻译是”比较“&#xff0c;以 able 结尾 说明它具有某种能力。 Comparator 中文翻译是”比较器“&#xff0c;以 or 结尾 表明…

【C++ 二十】STL:遍历、查找、排序、拷贝和替换、算术生成、集合算法

STL&#xff1a;遍历、查找、排序、拷贝和替换、算术生成、集合算法 文章目录 STL&#xff1a;遍历、查找、排序、拷贝和替换、算术生成、集合算法前言1 常用遍历算法1.1 for_each1.2 transform 2 常用查找算法2.1 find2.2 find_if2.3 adjacent_find2.4 binary_search2.5 count…

室内人员定位系统源码,采用java语言+UWB定位技术开发

运用UWB定位技术开发的人员定位系统源码 文末获取联系 本套系统运用UWB定位技术开发的高精度人员定位系统&#xff0c;通过独特的射频处理&#xff0c;配合先进的位置算法&#xff0c;可以有效计算复杂环境下的人员与物品的活动信息。 系统提供位置实时显示、历史轨迹回放、人…

循序渐进,学会用pyecharts绘制瀑布图

循序渐进&#xff0c;学会用pyecharts绘制瀑布图 瀑布图简介 瀑布图(Waterfall Plot)是由麦肯锡顾问公司所独创的图表类型&#xff0c;因为形似瀑布流水而称之为瀑布图。 瀑布图采用绝对值与相对值结合的方式&#xff0c;适用于表达多个特定数值之间的数量变化关系。当用户想…

本地Nacos设置脚本命令启动

一、起因&#xff1a; 每次启动都要找到位置写一遍命令费劲。 1、可设置开机启动 2、可设置脚本自动 二、配置脚本&#xff1a; 1、这是我nacos的位置 用bat命令启动一个cmd命令行&#xff0c;然后在里面执行两天命令。 ①命令一&#xff1a;打开指定路径 ②命令二&#xf…

Java图书借阅管理系统详细设计和实现

基于JavaSpringHtml的图书借阅管理系统详细设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

cmd连接本地mysql数据库和远程服务器mysql数据库

1.在cmd窗口里连接本地的mysql数据库 打开运行窗口&#xff0c;输入cmd&#xff0c;确定 windowsr 或在左下角windows图标处鼠标右键&#xff0c;点击运行按钮打开运行窗口 格式&#xff1a; mysql -u用户名 -p密码 mysql -uroot -p123456 成功进入mysql 2. 在cmd窗口里连接远…

尚硅谷_宋红康_第17章_反射机制

第17章_反射机制 本章专题与脉络 1. 反射(Reflection)的概念 1.1 反射的出现背景 Java程序中&#xff0c;所有的对象都有两种类型&#xff1a;编译时类型和运行时类型&#xff0c;而很多时候对象的编译时类型和运行时类型不一致。 Object obj new String(“hello”); obj.ge…

Django使用Celery异步发送邮件

Django使用Celery异步发送邮件 前言邮箱配置Django项目发送邮件配置邮件服务器Django发送邮件模块 Celery概述工作模式安装Celery Celery的基本使用创建config.py配置文件创建Celery实例并加载配置定义任务启动Celery服务提交任务异常 Celery发送邮件创建config.py配置文件创建…

机器学习 day05(多元线性回归,向量化,及向量化高效的原理)

1. 单个特征&#xff08;变量&#xff09;的线性回归模型 房子的价格仅由房子的大小决定&#xff0c;如图&#xff1a; 2. 多个特征&#xff08;变量&#xff09;的线性回归模型 房子的价格由房子的大小&#xff0c;房子有多少个卧室&#xff0c;房子有几层&#xff0c;房子…

2023年,逆势拿到大厂Offer,我怎么做?|原创

关于面试&#xff0c;做一些经验分享。 过年时候默默给自己定下了3个目标。第一个就是2023要换一份喜欢的工作。没想到在4月就提前实现了这个目标。 是一个我很看好的大厂&#xff0c;期待的岗位、看好的方向&#xff0c;薪资涨幅也比较给力。最近这段时间没空发文章&#xff0…

MySql中,join 语句怎么优化?

既然每次从驱动表取数据比较耗时&#xff0c;那我们每次从驱动表取一批数据放到内存中&#xff0c;然后对这一批数据进行匹配操作。这批数据匹配完毕&#xff0c;再从驱动表中取一批数据放到内存中&#xff0c;直到驱动表的数据全都匹配完毕 批量取数据能减少很多IO操作&#…

二十三、高级网络技术及应用——BFD解析

文章目录 前言一、BFD 简介1、概述&#xff1a;2、作用&#xff1a; 二、静态路由调用 BFD1、配置静态 BFD2、配置动态 BFD 三、OSPF联动BFD四、BFD 单臂回声&#xff08;one arm echo&#xff09; 前言 BFD&#xff1a;Bidirectional Forwarding Detection&#xff0c;双向转…

奇舞周刊第490期:WebAssembly 多语言/宿主环境中的使用

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞精选 ■ ■ ■ WebAssembly 多语言/宿主环境中的使用 WebAssembly (WASM) 的一个优势就是能够支持将不同语言编译成 WASM 代码&#xff0c;然后在不同的宿主环境中运行。这样就可以在不同的宿主环…

【WSN定位】基于多通信半径和跳距加权优化的Dvhop定位算法【Matlab代码#15】

文章目录 1. 原始Dvhop定位算法2. 多通信半径3. 加权跳距4. 部分代码展示5. 仿真结果展示6. 资源获取 1. 原始Dvhop定位算法 可参考Dvhop定位算法 2. 多通信半径 设网络通信半径为 R R R&#xff0c;将锚节点与邻居节点间分为 m m m级&#xff0c;网络中各信标节点与其邻居节…