加载动作在JVM外部实现, 以便让应用程序决定如何获取所需的类.
JVM 提供三种类加载器.
启动类加载器 (Bootstrap ClassLoader)
负责加载 JAVA_HOME\lib 目录中的, 或通过-Xbootclasspath 参数指定路径中的, 且被
虚拟机认可(按文件名识别, 如 rt.jar) 的类
扩展类加载器(Extension ClassLoader)
负责加载 JAVA_HOME\lib\ext 目录中的,或通过 java.ext.dirs 系统变量指定路径中的类
库
应用程序类加载器(Application ClassLoader)
负责加载用户路径(classpath)上的类库
JVM 通过双亲委派模型进行类的加载, 当然我们也可以通过继承 java.lang.ClassLoader
实现自定义的类加载器。
双亲委派
当一个类收到了类加载的请求, 他首先不会自己去加载这个类, 而是将请求委托给它的父类, 每一层类加载都是如此, 所以所有请求都会到启动类加载器中, 只有父类加载器反馈请求无法完成的时候, 子类加载器才会去尝试加载.
采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载
器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载
器最终得到的都是同样一个 Object 对象。