类加载器负责将.class文件(可能在磁盘上,也可能在网络上)加载到内存中,并为之生成对应的java.lang.Class对象。当JVM启动时,会形成有三个类加载器组成的初始化类加载器层次结构。如下:
当JAVA虚拟机起来时,首先会通过BootStrap类装载器加载JRE/lib/rt.jar的类。此类装载器也叫引导(原始 )类加载器,它负责加载java核心类。这个加载器是非常特殊的,它实际上不是java.lang.ClassLoader的子类,而是有JVM自身实现的。可以通过执行以下代码来获取bootstrap classloader加载了哪些核心类库:
URL[] urls=sum.misc.Launcher.getBootpstrapClassPath().getURLs();
for(int i=0; i<urls.length; i++)
{
System.out.println(urls[i].toExternalForm());
}
由于JVM在启动时它就会自动加载它们,所以不需要在系统属性CLASSPATH中指定这些类库。
extension classloader扩展类加载器,它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext或者有java.ext.dirs系统属性指定的)中的jar包。这为引入除java核心类以外的新功能提供一个标准机制。因为默认的扩展目录对所有重同一个JRE中启动的JVM都是通用的,所以放入这个目录的JAR类包对所有的JVM和system classloader都市可见的。
我们一般写的程序是由AppClassLoader类装载器进行装载。此类装载器,也叫系统类加载器,它负责JVM启动时,加载来自在命令java中的-classpath或者java.class.path系统属性活则CLASSPATH操作系统属性所指定的JAR类包和类路径。
可以通过静态方法。ClassLoader.getSystemClassLoader()找到该类加载器。如果没有特别指定,则用户自动以的任何类加载器都将该类加载器做为父类加载器。