请你谈谈如何破坏双亲委派模型?

1什么是双亲委派模型?

https://blog.csdn.net/zs18753479279/article/details/114497506

2如何破坏双亲委派模型?

典型的两个方法:1自定义类加载器,重写loadClass方法;2使用线程上下文类加载器;
在这里插入图片描述
1 重写loadclass()方法破坏双亲委派模型
loadclass的作用就是通过指定的全限定名加载class。这里最主要的是重写loadclass()方法,因为**双亲委派机制的实现就是通过这个方法实现的,这个方法可以指定类通过什么加载器来加载,所以如果我们改写他的规则,就相当于打破了双亲委派机制。**默认的过程就是这样的,先判断这个类是不是已经被当前层的类加载器加载过了,如果没有加载过就将该类委派给父类加载器,如果父类加载器无法加载就向下传递,回来由自己来进行加载,重写这个方法以后就能自己定义使用什么加载器了,也可以自定义加载委派机制,也就打破了双亲委派机制。重写loadclass() 也就有可能将findclass()也重写。

2线程上下文类加载器破坏双亲委派模型
双亲委派模型的局限性:父类加载器无法加载子类加载器路径中的类。双亲委派模型最典型的不适用场景是SPI的使用。所以提供了一种线程上下文类加载器,能够使父类加载器调用子类加载器进行加载。
简单来说就是接口定义在了启动类加载器中,而实现类定义在了其他类加载器中,当启动类加载器需要加载其他子类加载器路径中的类时,使用了线程上下文类加载器(默认是应用程序类加载器)来实现父类调用子类的加载器进行类的加载。

3目前OSGi已经成为了业界“事实上”的Java模块化标准,而OSGi实现模块化热部署的关键则是 它自定义的类加载器机制的实现。每一个程序模块(OSGi中称为Bundle)都有一个自己的类加载器,当需要更换一个Bundle时,就把Bundle连同类加载器一起换掉以实现代码的热替换。
在OSGi环境下,类加载器不再是双亲委派模型中的树状结构,而是进一步发展为更加 复杂的网状结构

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值