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环境下,类加载器不再是双亲委派模型中的树状结构,而是进一步发展为更加 复杂的网状结构