启动类加载器(Bootstrap ClassLoader):负责将JAVA_HOME/lib 目录下的,或者被-Xbootclasspath参数所指定的路径中的,被虚拟机识别的类库(仅按文件名识别,如rt.jar,名字不符合的类库不会加载)加载到虚拟机内存中。启动类加载器无法被Java程序直接引用。
扩展类加载器(Extension ClassLoader):加载JAVA_HOME/lib/ext目录下的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。
应用程序类加载器(Application ClassLoader):也成为系统加载器。负责加载用户类路径(classpath)下所指定的类库,开发者可以直接使用这个类加载器。如果应用程序中没有自定义自己的类加载器,一般这个就是程序中默认的类加载器。
双亲委派模型如图:
图中的类加载器之间的层次关系,称为类加载器的双亲委派模型。
双亲委派模型要求除了顶层的启动类加载器之外,其他的加载器都要有自己的父加载器。这里类加载器之间的父子关系不以继承而是以组合方式来实现。
双亲委派模型的工作过程是:每一个类加载器收到类加载请求,都会首先将请求委派到其父加载器去完成,只有当父加载器无法完成加载,子加载器才会尝试自己去加载。
双亲委派模型的好处是Java类随着它的加载器一起具备了优先级的层级关系。如java.lang.Object,它存在于rt.jar,无论哪个类加载器要加载这个类,最终都要委派给顶层的启动加载器,因此Object在程序的各类加载器环境中都是同一个类。即使用户自己定义一个java.lang.Object类,也无法被加载。