面试官问:如何打破双亲委派机制?

一. 引言

在上篇JVM类加载机制中,讲到了类加载的双亲委派机制,那为什么又要打破双亲委派机制呢?难道是它不好用吗?

我们想一个场景,比如在一个tomcat中,部署了多个应用包,其中一个包使用的是spring5.0,另一个包使用的是spring4.0,此时在双亲委派机制下,如果先加载spring4.0的包,那么另一个使用spring5.0的包再来加载的时候发现spring的相关类已经被类加载器加载过了,就不会再次加载。可想而知,这就会导致巨大的兼容性问题。因此,在特殊场景下,是需要打破双亲委派机制的。

二. 如何打破双亲委派机制

打破双亲委派机制实际上就是不让父加载器加载来加载我们需要的类,下面我们来尝试一下用自定义类加载器打破双亲委派机制来加载一个自定义的String类

看过上篇文章的小伙伴一定知道,其实双亲委派的核心代码就是这里

 那我们就直接来改写这个方法

很简单,直接把双亲委派机制的代码删除即可

运行一下

 报错了,系统提示java\lang\Object.class (系统找不到指定的路径。) 找不到这个类

怎么解决呢?

感觉能想到最简单的方法,就是把Object.class复制到我们自己的类路径下

说试就试

我在自己的目录下新建java.lang包,然后把Object.class丢到这个目录下,再运行看看

 

 又报错了,这是为什么呢?

沙箱安全机制! 这是为了防止java的核心类库被随意篡改,如果随便一个人都可以来修改java的核心类库的话,那程序还有什么安全性可言?

那么接下来再针对这个问题对代码做个修改,既然核心类库不让我修改,那么核心类库我就继续沿用双亲委派机制好了呗,只对自己的类来打破双亲委派机制

 如果是自己的文件则使用自定义类加载器,如果是其他类则使用默认类加载器

验证成功,到这里我们已经顺利打破双亲委派机制啦~ 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑着猪猪去旅行A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值