类加载器用以实现类加载功能,并且确定被加载的类在Java虚拟机中的唯一性。

注意:由同一个类加载器加载,则这两个类相等,由不同的类加载器加载,则这两个类不相等。

我们知道类加载器主要分为:

  • 启动类加载器
  • 扩展类加载器
  • 应用程序类加载器

启动类加载器

负责加载以下类:

  • 存放在JAVA_HOME\lib目录中的类;
  • 被-Xbootclasspath参数所指定路径中、并且是被虚拟机识别的类库。

注意:启动类加载器不能直接被java程序直接饮用。

扩展类加载器

负责加载以下类:

  • JAVA_HOME\lib\ext目录中的类;
  • 被java.ext.dirs系统变量所指定的路径中的所有类。

注意:开发者可以直接使用扩展类加载器。

应用程序类加载器

负责加载用户类路径(classpath)上所指定的类库。

注意:该类加载器也被称为系统类加载器,开发者可以直接使用该类加载器。若开发者没有自定义类加载器,程序默认使用该类加载器。

各种类加载器并不是孤立的,而是互相配合使用。

在java虚拟机中,各种类加载器配合使用的模型就是双亲委派模型

双亲委派模型

双亲委派模型的工作流程全部在ClassLoader的loadClass()方法中执行:

@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { Class<?> c = findLoadedClass(name); // 检查需要加载的类是否已经被加载过if (c == null) { try { // 若没有加载,则调用父加载器的loadClass()方法if (parent != null) { c = parent.loadClass(name, false); }else{ // 若父类加载器为空,则默认使用启动类加载器作为父加载器c=findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { // 若父类加载器加载失败会抛出ClassNotFoundException, //说明父类加载器无法完成加载请求 } if(c==null){ // 在父类加载器无法加载时 // 再调用本身的findClass方法进行类加载 c=findClass(name); } } if(resolve){ resolveClass(c); } return c;
}
复制代码

若一个类加载器收到了类加载请求:

步骤:

  • 把该类加载请求委派给父加载器父完成,而不是自己去加载;(每层的类加载器都是如此,因此所有的类加载请求最终都会交由启动类加载器去加载)
  • 只用当父类加载器反馈自己无法完成该加载请求时,自加载器才会自己加载。

优点:

Java类随着它的类加载器一起具备了一种带优先级的层次关系。

ClassLoader的双亲委派模型相关推荐

  1. java 类加载 双亲委派_java类加载器和双亲委派模型

    一. 类加载器 ClassLoader即常说的类加载器,其功能是用于从Class文件加载所需的类,主要场景用于热部署.代码热替换等场景. 系统提供3种的类加载器:Bootstrap ClassLoad ...

  2. 分析JVM双亲委派模型的类加载源码 自定义类加载器

    双亲委派模型下,在父类加载器无法加载的情况下再由当前类加载器去加载.具体的实现逻辑在java.util.ClassLoader抽象类的loadClass方法中.在该方法中,先检查是否已经加载过,如果没 ...

  3. java 打破双亲委派,为什么说java spi破坏双亲委派模型?

    虽然有SPI破坏双亲委派模型的说法,但我不太认同.简单说下. 双亲委派模型(再次吐槽下这个翻译),是一种加载类的约定.这个约定的一个用处是保证安全.比如说你写Java用了String类,你怎么保证你用 ...

  4. jvm:类加载器与双亲委派模型

    两个类相等需要类本身相等,并且使用同一个类加载器进行加载.这是因为每一个类加载器都拥有一个独立的类名称空间. 这里的相等,包括类的 Class 对象的 equals() 方法.isAssignable ...

  5. amba simple class驱动_学习笔记:class加载器和双亲委派模型

    类加载器 类加载器有四种 启动类加载器(Bootstrap ClassLoader) 负责加载 JAVA_HOMElib ⽬录中的,或通过-Xbootclasspath参数指定路径中的且被虚拟机认可( ...

  6. 面向对象回顾(静态变量、类加载机制/双亲委派模型、Object类的方法、类和对象区别)

    1. 静态变量存在什么位置? 方法区 2. 类加载机制,双亲委派模型,好处是什么? 某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务, ...

  7. 类加载器、双亲委派模型

    目录 1.简介 2.类和类加载器 3.双亲委派模型 3.1 启动类加载器: 3.2 扩展类加载器 3.3应用程序类加载器 3.4  类加载器的双亲委派模型(Parents Delegation Mod ...

  8. Java虚拟机:对象创建过程与类加载机制、双亲委派模型

    一.对象的创建过程: 1.对象的创建过程: 对象的创建过程一般是从 new 指令(JVM层面)开始的,整个创建过程如下: (1)首先检查 new 指令的参数是否能在常量池中定位到一个类的符号引用: ( ...

  9. 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器

    28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...

最新文章

  1. 生信分析-PS修改坐标
  2. wordpress自动批量定时发布插件 DX-auto-publish
  3. 获取文件夹所占空间的大小
  4. JavaFX中基于表达式的PathTransitions
  5. 西南科技大学研究生计算机,我们毕业啦……西南科技大学2020研究生毕业记!...
  6. C++ primer 11章关联容器
  7. c语言RTK算法,C-RTK 9P定位系统
  8. XMLHttpRequest.overrideMimeType()
  9. 无法执行任何java命令,报错OutOfMemoryError: Cannot create GC thread. Out of system resources
  10. 海康相机SDK+halcon17(64位)+MFC+VS(64位)联合开发遇到的问题(在使用GenImage3Extern将RGB数据转换为halcon图像时出现异常情况处理)
  11. C语言学生成绩排名系统
  12. (王道408考研操作系统)第一章计算机系统概述-第一节1、2:操作系统概念、概念和特征
  13. java实现同步的5种方式
  14. php死循浏览器卡死,Win10 Edge浏览器假死解决方案
  15. 简易网页版进程管理器(支持手机管理电脑进程)
  16. java i18n utf_Java国际化(i18n)字符串与Unicode转换
  17. 微信小程序接口实现加密
  18. css案例2——黑白滤镜
  19. 计算机图形学必备的数学知识
  20. 字符串(一) | 剑指 Offer 58 - II. 左旋转字符串、541. 反转字符串 II、剑指 Offer 05. 替换空格、151. 反转字符串中的单词

热门文章

  1. 【学习笔记】Android视图动画学习
  2. 汇编语言 寄存器 2.9~2.12 总结
  3. PHP远程DoS漏洞深入分析及防护方案
  4. 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)...
  5. 浅析枚举类型(Enumerated types)
  6. Windows2003 IIS安装
  7. ORACLE同步数据库之,自动生成sequence 文件
  8. Linux多线程实践(一)线程基本概念和理论
  9. 设计模式-组合+策略模式
  10. 自制MVC之工具类插件一