双亲委派模型
先看图
java自带三种类加载器, BootStrapClassLoader,ExtClassLoaer,AppClassLoader,
其中BootStrapClassLoader是*,ExtClassLoader是BootStrapClassLoader的子加载器,AppClassLoader是ExtClassLoader的子加载器。
BootStrapClassLoader 负责加载jdk下lib下的文件,
ExtClassLoader负责加载Ext文件夹下的文件。
AppClassLoader负责加载平常我们所写的类和引入的jar包中的类。
所以,当我们写一个类,需要加载的时候,就使用到了java的双亲委派机制。
首先AppClassLoader 类加载器向上查找缓存,看ExtClassLoader是否加载过此类,如果加载,则直接从缓存中取,如果没有,则ExtClassLoader再向上查询
BootStrapClassLoader类加载器是否加载过此类,如果加载,则缓存中取,没有的话,则查询加载路径,有则加载返回,没有则推给ExtClassLoader查找加载
路径,有则加载返回,没有则推给AppClassLoader查询加载路径,加载返回。
双亲委派模型的好处
1 主要为了安全性,避免用户自己编写的类动态替换java的核心类,比如用户自己编写一个String类。
2 同时也避免了类的重复加载,因为jvm中区分不同类,不仅仅根据类名,相同的class文件被不同的类加载器加载就是两个不同的类。