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, 服务器类加载器

参考资料:

类加载器(ClassLoader)的更多相关文章

  1. Java虚拟机学习(5):类加载器(ClassLoader

    类加载器 类加载器(ClassLoader)用来加载 class字节码到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源文件在经过 Javac之后就被转换成 ...

  2. 深入理解Java类加载器(ClassLoader)

    深入理解Java类加载器(ClassLoader) Java学习记录--委派模型与类加载器 关于Java类加载双亲委派机制的思考(附一道面试题) 真正理解线程上下文类加载器(多案例分析) [jvm解析 ...

  3. 深入理解Java类加载器(ClassLoader) (转)

    转自: http://blog.csdn.net/javazejian/article/details/73413292 关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Ja ...

  4. jvm之java类加载机制和类加载器(ClassLoader),方法区结构,堆中实例对象结构的详解

    一.类加载或类初始化:当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.连接.初始化3个步骤来对该类进行初始化.如果没有意外,JVM将会连续完成3个步骤. 二.类加载时机:  1 ...

  5. Java 类加载器(ClassLoader)

    类加载器 ClassLoader 什么是类加载器? 通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到Java虚拟机外部去实现, 以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代 ...

  6. 类加载器ClassLoader的理解

    最近在做一个热加载Class的小组件,这个组件需要对类加载器ClassLoader有所了解,我就顺便借这个机会把学到的一点皮毛与大家分享一下. 从Class文件开始 ClassLoader,顾名思义就 ...

  7. 类加载器ClassLoader

    上篇文章说到,Class类可以通过一个类的全限定名去加载类,那么底层是如何去加载的呢?这就是我们今天要聊的类加载器ClassLoader,其可以通过一个类的全限定名来获取描述此类的二进制字节流,也即是 ...

  8. 类加载器ClassLoader之jar包隔离

    小引子 最近做了一个根据同一模块的不同jar版本做同时测试的工具,感觉挺有意思,特此记录. 类加载器(ClassLoader)是啥? 把类加载阶段中的"通过一个类的全限定名(博主注:绝对路径 ...

  9. 浅析java类加载器ClassLoader

    作为一枚java猿,了解类加载器是有必要的,无论是针对面试还是自我学习. 本文从JDK提供的ClassLoader.委托模型以及如何编写自定义的ClassLoader三方面对ClassLoader做一 ...

  10. Java中的类加载器----ClassLoader

    1.简单的讲类加载器就是加载类. 在一个类要被执行时,首先会被从硬盘中加载到内存中,这个任务就是由类加载器来完成,如果加载不成功时,类是无法被执行的.类加载器执行的都是字节码二进制文件.   帮助文档 ...

随机推荐

  1. jQuery OCUpload ——> 一键上传插件

    OCUpload为jQuery的插件(One Click Upload),意思为一键上传,封装了对于文件上传的一些方法,只需几行代码,文件上传优雅而简洁.      对于传统的文件上传,只是通过inp ...

  2. SVN学习(一)——SVN 检出文件步骤、图标显示及含义

    May, I come... 1. 创建一个目录用来存放检出得到的文件,例如MyCRM 2. 直接进入目录MyCRM,点右键 3. 可以看到检出得到的文件 此时文件图标上没有任何标识.可能你会想到通过 ...

  3. 使用 Visual Studio 2012进行C语言开发

    1.打开visual studio,选择菜单[文件]->[新建]->[项目],将会弹出新建项目对话框 2.在弹出的新建项目对话框中,选择和填补相应的属性. 3.点击确定之后,会跟着弹出应用 ...

  4. SpringCloud系列十二:手动创建Feign

    1. 回顾 上文讲解了自定义Feign.但是在某些场景下,前文自定义Feign的方式满足不了需求,此时可使用Feign Builder API手动创建Feign. 本文围绕以下场景,为大家讲解如何手动 ...

  5. [ci]安装配置jenkins及其插件

    后面尝试ms模式部署多台jenkins 安装jenkins:(hudson是jenkins的商业版) cd /etc/yum.repos.d/ wget http://pkg.jenkins.io/r ...

  6. mybatis 使用注解实现多参数传递

    若映射器中的方法只有一个参数,则在对应的SQL语句中,可以采用#{参数名}的方式来引用此参数,以前的例子多属于此类.但这种方法却不适用于需要传递多个参数的情况,今天就来介绍如何使用注解传递多个参数 一 ...

  7. 【转载】IE下利用滤镜实现背景颜色渐变

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. VS2013-解决VS2013 4996错误

    由于微软在VS2013中不建议再使用C的传统库函数scanf,strcpy,sprintf等,所以直接使用这些库函数会提示C4996错误,在源文件中添加以下指令就可以避免这个错误提示. )

  9. java计算两个日期相差多少天小时分钟等

    1.时间转换 data默认有toString() 输出格林威治时间,比如说Date date = new Date(); String toStr = date.toString(); 输出的结果类似 ...

  10. 推送本地文件夹到github

    1.首先鼠标右键,Git Init Here将文件夹初始化为仓库 2.打开github桌面版 3.点击添加本地仓库 4.填好summary和description并提交 5.push到自己的githu ...