Fork me on GitHub

类加载器(ClassLoader)

1. 类加载器概述

1.1 类加载器的作用

  • 把 .class 文件加载到 JVM 的方法区中,变成一个 Class 对象!

1.2 类加载器分类

  1. 类加载器也是一个类: ClassLoader;
  2. Java 提供了三种类加载器:
    • 引导类加载器, 加载 java 自己的类库, 即 rt.jar 中的类;
    • 扩展类加载器, 加载扩展 jar 包, 即 lib/ext 目录下的类;
    • 系统类加载器, 加载 classpath 下的类, 包含开发人员写的类,和第三方的 jar 包.
  3. 类加载器之间存在上下级关系,系统类加载器的上级是扩展类加载器, 而扩展类加载器的上级是引导类加载器.

2. 类加载器的委托机制

  1. 代码中出现这么一行: new A();
    • 系统发现了自己加载的类, 其中包含了 new A(), 这说明需要系统去加载 A 类;
    • 系统会给自己的领导打电话, 让扩展去自己的地盘去加载 A 类;
    • 扩展会给自己的领导打电话, 让引导区自己的地盘去加载 A 类;
    • 引导自己真的区 rt.jar 中寻找 A 类
      • 如果找到了, 那么加载之,然会返回 A 对应的 Class 对象给扩展, 扩展也会把这个 Class
        返回给系统, 这样,类加载就结束了.
      • 如果没有找到, 引导给扩展返回一个 null, 扩展会自己去自己的地盘,去寻找 A类;
        • 如果找到了, 那么加载之,然后返回 A 对应的 Class 对象给系统,这样, 类加载就结束了;
        • 如果没有找到,扩展返回一个 null 给系统, 系统去自己的地盘(应用程序下)加载 A 类;
          • 如果找到了, 那么加载之, 然后返回这个 Class 对象, 类加载就结束了;
          • 如果没找到, 则抛出异常 ClassNotFoundException

3. Tomcat 的类加载器

3.1 Tomcat 提供两种类加载器

  • 服务器类加载器: 它负责加载 ${CATALINA_HOME}/lib 目录下的类;
  • 应用类加载器: 它负责加载 ${CONTEXT_HOME}/WEB-INF/lib${CONTEXT_HOME}/WEB-INF/classes 目录下的类;

3.2 特性

  1. 服务类加载器: 先自己动手,然后再去委托;
  2. 应用类加载器: 先自己动手,然后再去委托;
  3. Tomcat 类加载器优先级(由高到低)
    • 应用下的 classes, 应用类加载器
    • 应用下的 lib, 应用类加载器
    • 服务器下的 lib, 服务器类加载器

参考资料:

posted @ 2017-10-17 15:51  小a的软件思考  阅读(223)  评论(0编辑  收藏  举报