一.类加载器的分类
JDK自带有三个类加载器:引导ClassLoader、ExtClassLoader、AppClassLoader。
BootStrapClassLoader
BootStrapClassLoader是ExtClassLoader的父类加载器,默认负责加载%JAVA HOME%6lib下的jar包和class文件
ExtClassLoader
ExtClassLoader是AppClassLoader的父类加载器,负责加载%JAVA HOME%/lib/ext文件夹下的jar包和class类。
AppClassLoader
AppClassLoader是自定义类加载器的父类,负责加载classpath 下的类文件。
重点提醒,三个类加载器的父子类关系并不是extend 继承的子父类关系,而是逻辑上的子父类,是通过他们当中的一个变量实现的。
三者都继承ClassLoader实现自定义类加载器。
二.双亲委派机制
1. 委派的过程就是一层一层向上找的过程。只要当前加载器加载过,就不会重新加载。如果没有加载过,会向上寻找是否加载过。
2. 当加载到Bootstrap ClassLoader后会一层一层的向下判断是否可以进行加载,如果能加载则加载。如果不能加载向下一层寻找下个加载器是否能加载。如果到最后一层都无法加载则报ClassNotFoundException。
好处:避免核心类的串改(优先Bootstrap classloader),避免重复加载(加载一次就不加载)。