类与类加载器
双亲委派模型
3层类加载器
- 启动类加载器(Bootstrap Class Loader)
- 负责加载
<JAVA_HOME>\lib
目录 或-Xbootclasspath
所指定路径下,并且是Java虚拟机能够识别的类库
- 负责加载
按照文件名识别,如rt.jar、tools.jar。即使名称不符合的类库放到lib下也不会加载。
- 扩展类加载器(Extension Class Loader)
- 负责加载
<JAVA_HOME>\lib\ext
目录 或java.ext.dirs
系统变量所 指定路径下所有的类库。 - 这个类加载器是在类
sun.misc.Launcher$ExtClassLoader
中以Java代码的形式实现的- 应用程序类加载器(Application Class Loader)
- 负责加载用户类路径 (ClassPath)上所有的类库
- 这个类加载器由
sun.misc.Launcher$AppClassLoader
来实现。 - 由于应用程序类加载器是ClassLoader类中的getSystem-
ClassLoader()方法的返回值,所以有些场合中也称它为
“**系统类加载器**”
。加载过程
JDK 9之前的Java应用都是由这三种类加载器互相配合来完成加载的,如果用户认为有必要,还可 以加入自定义的类加载器来进行拓展,典型的如增加除了磁盘位置之外的Class文件来源,或者通过类 加载器实现类的隔离、重载等功能。
图中展示的各种类加载器之间的层次关系被称为类加载器的“双亲委派模型(Parents Delegation Model)”。双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载 器。不过这里类加载器之间的父子关系一般不是以继承(Inheritance)的关系来实现的,而是通常使用 组合(Composition)关系来复用父加载器的代码。