类与类加载器

双亲委派模型

3层类加载器

  1. 启动类加载器(Bootstrap Class Loader)
    1. 负责加载<JAVA_HOME>\lib目录 或 -Xbootclasspath所指定路径下,并且是Java虚拟机能够识别的类库

按照文件名识别,如rt.jar、tools.jar。即使名称不符合的类库放到lib下也不会加载。


    1. 扩展类加载器(Extension Class Loader)
  1. 负责加载<JAVA_HOME>\lib\ext目录 或 java.ext.dirs系统变量所 指定路径下所有的类库。
  2. 这个类加载器是在类sun.misc.Launcher$ExtClassLoader中以Java代码的形式实现的
    1. 应用程序类加载器(Application Class Loader)
  3. 负责加载用户类路径 (ClassPath)上所有的类库
  4. 这个类加载器由 sun.misc.Launcher$AppClassLoader来实现。
  5. 由于应用程序类加载器是ClassLoader类中的getSystem- ClassLoader()方法的返回值,所以有些场合中也称它为“**系统类加载器**”

    加载过程

    JDK 9之前的Java应用都是由这三种类加载器互相配合来完成加载的,如果用户认为有必要,还可 以加入自定义的类加载器来进行拓展,典型的如增加除了磁盘位置之外的Class文件来源,或者通过类 加载器实现类的隔离、重载等功能。

7.4 类加载器 - 图1

图中展示的各种类加载器之间的层次关系被称为类加载器的“双亲委派模型(Parents Delegation Model)”。双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载 器。不过这里类加载器之间的父子关系一般不是以继承(Inheritance)的关系来实现的,而是通常使用 组合(Composition)关系来复用父加载器的代码。

破坏双亲委派模型