什么是双亲委派模型?
????????Java 中的类加载器包括BootstrapClassLoader(启动类加载器),ExtensionClassLoader(扩展类加载器)以及AppClassLoader(应用程序类加载器)。其中BootstrapClassLoader主要用来加载JDK内部的核心类库,比如rt.jar,ExtensionClassLoader主要用来加载lib/ext目录下的jar包,AppClassLoader主要负责加载当前应用 classpath 下的所有 jar 包和类。
????????双亲委派的执行流程是,当类加载器进行类加载时,先判断是否存在父加载器,如果存在则调取父类加载器中的loadClass方法,直到最顶层的Bootstrap类加载器,此时开始加载类,如果自己无法加载,则使用子类加载器尝试加载。
????????这种设计的好处是,避免类的重复加载,保证了 Java 的核心 API 不被篡改。
如何打破双亲委派?
? ? ? ?重写ClassLoader中loadClass()方法即可。因为双亲委派的原理就是通过递归调用此方法来实现的。
? ? ? ? 实际应用场景:Tomcat 下 Web 应用之间的类实现隔离。就是自定义了类加载器 WebAppClassLoader 来通过打破双亲委托机制来实现的。