java双亲委派模型及其破坏

这里不再介绍java的类加载机制,只谈关于双亲委派在理解上的坑。

1. 双亲委派并不是要委派给两个 而是只委派给parent,这是翻译时带来的理解上的困难,个人认为翻译成祖先委派更加合理,因为委派是一级一级往上传递的。

2. 模型只是一个想法,在代码上体现为把父classloader传递给新建的classeloader,在新建的classloader中先调用父loader,不成功再自己load。其实具体写代码的时候这个传递的父classloader可以是你能获取到的任意的classloader,不一定就是当前类的classloader。

3. 如果如2中所述传递的不是当前类的classloader,就是破坏了双亲委派模型的。当然这种破坏一般情况下还是会使用的到祖先classloader。

获取到可用的classloader:

this.getClass().getClassLoader()   

this.getClass().getClass().getClassLoader()     //当然这个输出是null

Thread.currentThread().getContextClassLoader()

4.这几个方法最后一个最为特殊,网传这种方法破坏了双亲委派模型,而且使用范围比较广,其实破坏两个字只是一种概念上的违背,跟实际的代码没有任何关系,并不是某一个classloader在加载类的时候不先通过祖先加载类了,而是在使用ContextClassLoader时可以通过当前类的类加载器的子孙classloader加载类。为什么?因为这个是可以设置的,线程启动的时候可以设置为任意的classloader,跟线程中执行用到的类的类加载器没有任何关系。同理也可以在方法的入参上设置在方法内使用的类加载器,也破坏了双亲委派模型。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容