图中三个类加载器都是jdk自带的(JVM默认的类加载器)
AppClassLoader的父加载器是ExtClassLoader,ExtClassLoader的父加载器是BootStrapClassLoader
JVM加载一个类时,会调用AppClassLoader的loadClass方法加载这个类,不过在这个方法中,会先使用ExtClassLoader的loadClass方法来加载类,同样ExtClassLoader的loadClass方法中会先使用BootStrapClassLoader来加载类,如果BootStrapClassLoader加载到了就直接成功,如果BootStrapClassLoader没有加载到,那么ExtClassLoader就会尝试自己加载该类,如果没有加载到,那么则会由AppClassLoader来加载这个类
所以双亲委派是指JVM加载类时,会委派给Ext和BootStrap进行加载,如果没有加载到才由自己来加载
向上委派实际就是查找缓存,向下查找找的是加载路径
注:向上委派到顶层加载器为止,向下查找到发起加载的加载器为止
双亲委派模型的好处:
主要是为了安全性,避免用户自己编写的类动态替换掉java的一些核心类,比如String
同时也避免了类的重复加载,因为JVM区分不同的类,不仅仅是根据类名,相同的class文件被不同的classLoader加载就是不同的类
我们也可以自定义类加载方法,从而不用JVM的默认加载机制,比如tomcat就自定义了类加载器,因为如果tomcat中部署了多个应用,且不同应用中有相同的类名但是类的方法等都不一样的,就不能共用JVM默认的类加载机制了,tomcat使用了自定义的类加载器针对每一个应用都会对应一个类加载器实例,这样不同应用的类就形成了一个隔离