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,跟线程中执行用到的类的类加载器没有任何关系。同理也可以在方法的入参上设置在方法内使用的类加载器,也破坏了双亲委派模型。

你可能感兴趣的:(java双亲委派模型及其破坏)