启动类加载器
启动类加载器是Java虚拟机中最基础的类加载器,它主要负责加载第一个被虚拟机执行的特殊类——java.lang.ClassLoader,该类在虚拟机启动时被加载,并提供了所有其它类加载器的基础,也就是说,所有的类加载器都直接或者间接地继承自这个类。
启动类加载器由C++语言实现,并不是Java语言实现。此外,在Java中也无法通过代码获取到该类加载器对象的引用。
扩展类加载
扩展类加载器是用来加载Java系统扩展库的类加载器,负责加载$JAVA_HOME/lib/ext目录下的类库。扩展类加载器是在启动类加载器之后启动的,它也是纯Java代码实现的类加载器。
在Java中,扩展类加载器的父加载器是启动类加载器。这种方式保证了系统类库在运行时的稳定性和安全性。
应用程序类加载器
应用程序类加载器是应用程序中默认的类加载器。它主要负责加载应用程序classpath下的类,也就是我们平时自己写的Java代码所编译出来的.class文件。
双亲委派机制
Java的类加载机制采用的是双亲委派模型,这是一种经典的类加载机制,也是Java的类加载机制得以广泛使用的重要原因之一。
所谓“双亲委派”,就是在类加载的过程中,一个类加载器在加载某个类时,会先委托给它的父类加载器进行加载。如果父类加载器无法加载成功,再由自己来加载该类。这样做的好处在于,保证Java虚拟机安全、稳定地运行,避免出现恶意代码污染系统。
在Java中,类加载器会一直询问其父加载器是否能够加载某个类,直到达到启动类加载器(即基类加载器)时,如果该类还没有被加载,此时才交由启动类加载器去加载这个类。因为启动类加载器是由Java虚拟机自身实现的,任何类都可以使用它来进行加载,所以启动类加载器就成为了Java虚拟机中的“保护神”。