什么是双亲委派:
Java利用的是不同的classLoader进行类的加载,类加载器由上而下可以分为bootstrap、Extension 、Application 、custom,一个加载器加载类时,首先交给上级类加载器加载,当所有上级类加载器都无法加载,也就是到了bootstrapclassLoader时,才会依次向下级加载直至变成自身加载。
目的:
这种机制可以让java定义的基础类无法被自定义的类覆盖,防止不安全的类加载;同时避免相同的类被重复加载;
缺点:
例如jdbc,DriverManager是由bootstrap加载的,但是其中的Driver是由第三方实现、Application classloader加载的,这种机制下bootstrap无法对Application加载的类进行加载,所以通过设置线程类加载器为应用程序加载器,从而在父加载器中完成请求子加载器的动作。因此在涉及一些spi的实现时,会打破这种机制。
要打破机制可以通过自定义类加载器实现,通过重写loadClass方法(重写类加载机制),或者findClass方法(父类加载失败会调用该方法)。
参考: