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

目录

1.说明
  • 1.双亲委派模型是Java类加载器的一个重要特性,但在某些特殊情况下,可能需要打破这种机制以满足特定需求。
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应用环境下的类隔离和资源共享。
相关推荐
麦兜*14 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
真实的菜1 天前
JVM类加载系统详解:深入理解Java类的生命周期
java·开发语言·jvm
在未来等你1 天前
JVM调优实战 Day 15:云原生环境下的JVM配置
java·jvm·性能优化·虚拟机·调优
黄雪超2 天前
JVM——函数式语法糖:如何使用Function、Stream来编写函数式程序?
java·开发语言·jvm
ThetaarSofVenice2 天前
对象的finalization机制Test
java·开发语言·jvm
很小心的小新2 天前
12、jvm运行期优化
java·开发语言·jvm·笔记
ThetaarSofVenice2 天前
垃圾收集相关算法Test
java·jvm·算法
暮 夏2 天前
Java测试题一
java·开发语言·jvm
程序员弘羽2 天前
C++ 第四阶段 内存管理 - 第二节:避免内存泄漏的技巧
java·jvm·c++
好名字更能让你们记住我2 天前
Linux多线程(十二)之【生产者消费者模型】
linux·运维·服务器·jvm·windows·centos