当前位置: 首页 > news >正文

【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.lryc.cn/news/485849.html

相关文章:

  • ReactPress与WordPress:一场内容管理系统的较量
  • 网络安全练习之 ctfshow_web
  • 在 Service Worker 中caches.put() 和 caches.add()/caches.addAll() 方法他们之间的区别
  • UNIAPP发布小程序调用讯飞在线语音合成+实时播报
  • 跳房子(弱化版)
  • ubuntu22 安装 minikube
  • STM32 | 超声波避障小车
  • 打造旅游卡服务新标杆:构建SOP框架与智能知识库应用
  • 通过脚本,发起分支合并请求和打tag
  • 【视频讲解】Python深度神经网络DNNs-K-Means(K-均值)聚类方法在MNIST等数据可视化对比分析...
  • 网络安全在线网站/靶场:全面探索与实践
  • Ceph 中Crush 算法的理解
  • D70【 python 接口自动化学习】- python 基础之数据库
  • C# LINQ数据访问技术
  • 【JavaSE线程知识总结】
  • FreeRTOS内存管理
  • 利用服务工作线程serviceWorker缓存静态文件css,html,js,图片等的方法,以及更新和删除及版本控制
  • MuMu模拟器安卓12安装Xposed 框架
  • 高级数据结构——hash表与布隆过滤器
  • 【网络】什么是交换机?switch
  • 软件测试 —— 自动化基础
  • 深入解析 OpenHarmony 构建系统-4-OHOSLoader类
  • 【Android、IOS、Flutter、鸿蒙、ReactNative 】实现 MVP 架构
  • 排序算法(基础)大全
  • Pytest从入门到精通
  • 《C++ 实现生成多个弹窗程序》
  • react 中 useRef Hook 作用
  • Scala-键盘输入(StdIn)-用法详解
  • 力扣(LeetCode)283. 移动零(Java)
  • ESP32C3单片机使用笔记---烧录MicroPython