书接上回,既然双亲委派模型既可以保证类加载器的层级优先级,也可以避免一个类被多次加载,为什么我们还要去破坏双亲委派机制呢?那破坏又是什么意思呢?又要通过什么方式去实现破坏双亲委派呢?
1、破坏双亲委派的含义
首先,我们可以知道,双亲委派是指三层类加载器各自有各自的加载范围,塔顶为核心,越往下越具体,破坏双亲委派则是,类加载器可以加载不属于自己范围的类,在双亲委派机制中做不到这一点,为什么呢?因为双亲委派的流程是,当前类加载器不会做处理,会先交给父类,直至塔顶,到达塔顶后,再逐层判断是否能够加载,注意,最后加载的类加载器,是一定可以加载这个类的,换句话说,该类一定在它的范围内,而破坏双亲委派则不同,类加载器可以加载不在它范围的类。
2、为什么要去破坏双亲委派呢
举个《深度理解Java虚拟机》书中的例子,JDBC的实现需要实现java.jdbc.Driver这个接口,这个接口是需要最顶层,启动类加载器去加载的,而这个接口的实现,是由数据库厂商提供的代码梵高自己的本地程序中,所以应该由应用程序类加载器去加载,那么问题来了,我底层的类加载器可以向上传递,最后调用上层类加载器,那我上层想用下层的类加载器怎么办?就像上面的情况一样,启动类加载器需要应用程序类加载器,但是双亲委派模型下,这种情况是不被理解的。
3、破坏双亲委派的方式
1、继承ClassLoader接口,实现loadClass()方法,这个方法可以去自定义类加载器
2、线程上下文类加载器,通过线程Thread类setContextClassLoader()
4、破坏双亲委派的价值
1、像上文提到的问题一样,解决了上层类加载器想要调用下层类加载器的问题。
2、用户对程序动态性的追求,比如代码热替换(Hot Swap)、模块热部署(Hot Deployment)