前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自定义双亲委派-JVM(三)

自定义双亲委派-JVM(三)

作者头像
用户9919783
发布2023-09-05 14:30:53
1560
发布2023-09-05 14:30:53
举报

上篇文章说了java类加载源码,双亲委派的加载。

JVM类加载&双亲委派-JVM(二)

一、自定义类加载器

1、全盘负责委托机制

“全盘委托”指当一个classLoader装载一个类时,除非显示的使用另外一个classLoader加载,否则该类所依赖的类也由该classLoader加载。

2、自定义类加载器

自定义继承的classLoader默认是app类加载器,上面还有ext扩展类加载器,以及bootStrapClass核心类加载器。

首先需要继承ClassLoader

因为这个类有两个关键方法,loadClass(String,boolean)实现了双亲委派,另一个findClass,默认是空方法,需要自己重写findClass。

findClass里我们重写的一个方法是defineClass也是jvm自己的一个方法逻辑。

这时候我们的sout里面打印的是什么类的加载器呢?

答案是app加载器,为什么,原因就是双亲委派,因为我们前面已经有一个MAIN230629这个类,它是由app类加载器加载。

如果我们把项目里这个类删掉,那么它打印的就是我们自定义你的myClassLoadTest。

3、打破双亲委派

我们前面自定义的loadClass是调用父类的,父类里面是支持双亲委派的,那么我们自己如何打破呢?

重写父类的loadClass,和findClass一样进行重写。

把双亲委派那段注释。

流程则是先看自己是否有,没有为null的时候,直接调用findClass自己去加载。

需要注意:核心类都不能加载

Object.class会报沙箱机制安全问题,因为不能加载。

所以不光要解决双亲委派加载问题,还要解决核心类由引导加载器加载,而自己定义的类由自定义加载器加载。

所以我在代码里加了如果不是我自己定义的包开头,则去用parent加载。

因为现在打破了双亲委派,再执行main方法。

结果输出的是:myClassLoader

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端从入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档