【jvm】如何破坏双亲委派机制

目录

        • 1.说明
        • 2.重写ClassLoader的loadClass方法
          • 2.1 原理
          • 2.2 实现步骤
          • 2.3 注意事项
        • 3.使用线程上下文类加载器
          • 3.1 原理
          • 3.2 实现步骤
          • 3.3 应用场景
        • 4.利用SPI机制
          • 4.1 原理
          • 4.2 实现步骤
          • 4.3 应用场景
        • 5.Tomcat等容器的自定义类加载器
          • 5.1 原理
          • 5.2 实现方式
          • 5.3 应用场景

1.说明
  • 1.双亲委派模型是Java类加载器的一个重要特性,但在某些特殊情况下,可能需要打破这种机制以满足特定需求。
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
2.重写ClassLoader的loadClass方法
2.1 原理
  • 1.通过继承ClassLoader类并重写其loadClass方法,可以自定义类的加载行为。
  • 2.在重写的方法中,可以控制是否调用父类加载器的loadClass方法,从而打破双亲委派模型。
2.2 实现步骤
  • 1.创建一个继承自ClassLoader的自定义类加载器。
  • 2.在自定义类加载器中重写loadClass方法。
  • 3.在重写的方法中,根据需求决定是否调用父类加载器的loadClass方法。
2.3 注意事项
  • 1.重写loadClass方法时需要谨慎处理类的加载逻辑,以避免出现类加载冲突或类定义错误等问题。
  • 2.如果完全重写loadClass方法而不调用父类加载器的loadClass方法,则需要注意处理类的依赖关系,确保所有依赖的类都能被正确加载。
3.使用线程上下文类加载器
3.1 原理
  • 1.Java中的每个线程都有一个关联的上下文类加载器(Context ClassLoader)。
  • 2.通过设置线程的上下文类加载器,可以实现类的加载,而不受双亲委派模型的限制。
3.2 实现步骤
  • 1.获取当前线程的上下文类加载器。
  • 2.使用setContextClassLoader方法设置新的上下文类加载器。
  • 3.通过新的上下文类加载器加载类。
3.3 应用场景
  • 1.线程上下文类加载器常用于JDBC等需要动态加载类的场景。
  • 2.例如,JDBC驱动通常由应用类加载器加载,而JDBC API则由启动类加载器加载。为了解决这个问题,JDBC使用线程上下文类加载器来加载数据库驱动。
4.利用SPI机制
4.1 原理
  • 1.SPI(Service Provider Interface)是一种服务发现机制。
  • 2.它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。
  • 3.通过SPI机制,可以实现父类加载器委托子类加载器加载类的需求,从而打破双亲委派模型。
4.2 实现步骤
  • 1.在META-INF/services目录下创建一个以接口全路径命名的文件。
  • 2.在文件中指定实现类的全路径。
  • 3.使用ServiceLoader类加载并实例化接口的实现类。
4.3 应用场景
  • 1.SPI机制常用于框架扩展和插件化开发。
  • 2.例如,Java的JDBC就使用了SPI机制来加载数据库驱动。
5.Tomcat等容器的自定义类加载器
5.1 原理
  • 1.在Tomcat等容器中,每个Web应用都有自己的类加载器。
  • 2.这些类加载器通常是通过继承ClassLoader类并重写其方法来实现的。
  • 3.通过这种方式,Tomcat等容器可以实现应用之间的类隔离,并打破双亲委派模型。
5.2 实现方式
  • 1.Tomcat等容器会为每个Web应用创建一个独立的类加载器。
  • 2.当需要加载类时,这些类加载器会首先在自己的命名空间中查找。
  • 3.如果找不到,则会委托给父类加载器进行查找。
  • 4.由于每个Web应用都有自己的类加载器,因此即使两个应用中有相同限定名的类,它们也会被视为不同的类。
5.3 应用场景
  • 1.Tomcat等容器的自定义类加载器常用于多Web应用环境下的类隔离和资源共享。

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

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

相关文章

深度学习工具和框架详细指南:PyTorch、TensorFlow、Keras

引言 在深度学习的世界中,PyTorch、TensorFlow和Keras是最受欢迎的工具和框架,它们为研究者和开发者提供了强大且易于使用的接口。在本文中,我们将深入探索这三个框架,涵盖如何用它们实现经典深度学习模型,并通过代码…

蓝桥杯-洛谷刷题-day3(C++)

目录 1.忽略回车的字符串输入 i.getline() ii.逐个字符的识别再输入 2.获取绝对值abs() 3.做题时的误区 4.多个变量的某一个到达判断条件 i.max() 5.[NOIP2016 提高组] 玩具谜题 i.代码 6.逻辑上的圆圈 i.有限个数n的数组 7.数组的定义 i.动态数组 1.忽略回车的字符串输…

fast-api后端 + fetch 前端流式文字响应

fast-api后端 fetch 前端流式文字响应 fast-api后台接口流式响应 前端fetch 流式文本数据处理 fast-api后台接口 流式响应 from fastapi.responses import StreamingResponse from tqdm import tqdm from pydantic import BaseModelclass ItemDataSingle(BaseModel):data: …

作用域、生命周期和链接性的英文解释

作用域 - Scope Scope refers to the region of a program where a variable, function, or other identifier can be accessed or referenced. 生命周期 - Lifetime (or Duration in some contexts) Lifetime describes the period during which a variable or object exists…

元器件封装

元器件封装类型 为什么越来越多用贴片元件,而不是插件元件 为什么越来越多用贴片元件,而不是插件元件 1.体积小、质量小、容易保存和运输; 2.容易焊接和拆卸。抗震效果好。 贴片元件不用过孔,用锡少。直插元件最麻烦的就是拆卸&a…

【jvm】为什么要用元空间替代永久代

目录 1. 说明2. 永久代的限制与问题2.1 内存管理限制2.2 垃圾收集效率2.3 类的卸载问题 3. 元空间的优势 1. 说明 1.Java使用元空间替代永久代,这一变化主要源于永久代在实现上存在的限制和问题,以及元空间所提供的更优性能和更高灵活性。2.Java使用元空…

基本数据类型:Kotlin、Dart (Flutter)、Java 和 C++ 的比较

文章目录 一、基本数据类型的比较1.1 整数类型1.2 浮点类型1.3 字符类型1.4 布尔类型1.5 小结 二、有符号和无符号整数三、二进制补码表示四、精度丢失问题五、结论 在编程语言中,基本数据类型是构建更复杂数据结构的基础。在本文中,我们将比较 Kotlin、…

C++ 的发展

目录 C 的发展总结:​编辑 1. C 的早期发展(1979-1985) 2. C 标准化过程(1985-1998) 3. C 标准演化(2003-2011) 4. C11(2011年) 5. C14(2014年&#xf…

《Python 网络爬虫》

一、引言 在当今信息时代,互联网上蕴含着大量有价值的数据。网络爬虫作为一种自动获取网页数据的技术手段,在数据挖掘、信息检索、市场分析等领域发挥着重要作用。Python 由于其简洁易学、功能强大的特点,成为了网络爬虫开发的热门语言之一。…

【MySQL】MySQL在Centos环境安装

🔥个人主页: Forcible Bug Maker 🔥专栏: MySQL 目录 🌈前言🔥卸载不要的环境🔥检查系统安装包🔥卸载这些默认安装包🔥获取mysql官方yum源🔥安装mysql yum源…

【算法】动态规划中01背包问题解析

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

Linux开发工具:Vim 与 gcc,打造高效编程的魔法双剑

文章目录 一、初识Vim模式 二、vim基本操作2.1基础操作2.2命令模式/正常模式2.2.1光标定位2.2.2复制粘贴、删除2.2.3撤销2.2.4替换字符2.2.5替换模式 2.3底行模式2.3.1退出vim和**保存文件**2.3.2定位文本字符串2.3.3命令2.3.4实现分屏2.3.5替换指定字符串 2.4补充指令2.4.1视图…

Spring Boot 启动时修改上下文

Spring Boot 启动时修改上下文 为了让项目在启东时,加载到封装的JAR中的国际化文件在封装JAR是增加以下配置类可用于更改启动上下文中的信息 import org.apache.commons.lang3.StringUtils; import org.springframework.context.ApplicationContextInitializer; i…

[JAVA]MyBatis框架—如何获取SqlSession对象实现数据交互(基础篇)

假设我们要查询数据库的用户信息,在MyBatis框架中,首先需要通过SqlSessionFactory创建SqlSession,然后才能使用SqlSession获取对应的Mapper接口,进而执行查询操作 在前一章我们学习了如何创建MyBatis的配置文件mybatis.config.xm…

Linux基础开发工具使用

目录 1. 软件包管理器yum 1.1 概念介绍 1.2 更换镜像源(可选) 1.3 工具的搜索/查看/安装/卸载 1.4 优势 2. vim编辑器 2.1 vi和vim 2.2 三种常用模式和操作 2.3 配置vim 3. Linux编译器-gcc/g 4. Linux调试器-gdb 5. make和Makefile 6.…

群控系统服务端开发模式-应用开发-前端图片格式功能开发

一、添加视图 在根目录下src文件夹下views文件夹下param文件夹下grade文件夹下&#xff0c;新建index.vue&#xff0c;代码如下 <template><div class"app-container"><div class"filter-container" style"float:left;"><…

wordpress建外贸独立站常用的多语言插件

WordPress是一个功能强大的内容管理系统&#xff0c;对于外贸独立站来说&#xff0c;多语言支持是非常重要的功能。以下是一些常用的WordPress多语言插件&#xff1a; 1. WPML (WordPress Multilingual) 这是最流行且功能最全面的多语言插件之一。它支持翻译整个网站&#xf…

RabbitMQ 通道(Channel)详解:方法使用、消息确认与拒绝

RabbitMQ 是一个强大且灵活的消息代理&#xff08;message broker&#xff09;&#xff0c;它支持多种消息协议。在 RabbitMQ 的交互模型中&#xff0c;通道&#xff08;Channel&#xff09;是一个核心概念。RabbitMQ 中的通道是 TCP 连接内的虚拟连接&#xff0c;允许在单个 T…

SOC Boot学习(三)——boot流程

一、PBL 初始化硬件 CLK初始化 Cpu Cache/MMU加载XBL_SEC以及XBL_LOADER&#xff0c;并且进行鉴别 二、XBL Loader(SBL) XBL ConfigPMIC 驱动DDR 初始化 training初始化SMEM加载各种image&#xff08;AOP、QSEE、QHEE、ABL&#xff09;并且验证 三、XBL Core&#xff08;U…

算力100问☞第4问:算力的构成元素有哪些?

算力的构成元素是一个多维度且相互交织的体系&#xff0c;它融合了硬件基础设施、软件优化策略、数据处理效能以及分布式计算技术等多个层面&#xff0c;共同塑造了强大的计算能力。具体如下&#xff1a; 1、硬件基础设施 中央处理器&#xff08;CPU&#xff09;&#xff1a;…