从 JAVA 开发人员角度, 类加载器分为:
- 启动类加载器,这个加载器负责把<HAVA_HOME>\lib 目录中或者 –Xbootclasspath下的类库加载到虚拟机内存中,启动类加载器无法被 Java 程序直接引用。
- 扩展类加载器:负责加载<HAVA_HOME>\lib\ext 下或者 java.ext.dirs 系统变量指定路径下 all 类库,开发者可以直接使用扩展类加载器。
- 应用程序类加载器,负责加载用户路径 classpath 上指定的类库,开发者可以直接使用这个类加载器,若应用程序中没有定义过自己的类加载器,一般情况下,这个就是程序中默认的类加载器。
双亲委派模型:若一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是把所这个请求委派给父类加载器去完成,每一层的加载器都是如此,因此 all 加载请求最终都应该传送到顶级的启动类加载器。只有当父类加载器反馈自己无法加载时(他的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。
双亲委派模型好处: eg, object 类。它存放在 rt.jar 中,无论哪个类加载器要加载这个类,最终都是委派给处于模型顶端的启动类加载器加载,因此 object 类在程序的各种加载环境中都是同一个类。