写在前面

本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定Java虚拟机

解答

当类加载器(Class-Loader)试图加载某个类型的时候,除非父加载器找不到相应类型,否则尽量将这个任务代理给当前加载器的父加载器去做。
使用委派模型的目的
1. 避免重复加载
2. 保障加载的安全性

补充

类加载器

启动类加载器(Bootstrap Class-Loader)

加载 jre/lib 下面的 jar 文件,如 rt.jar。

它是个超级公民,即使是在开启了 Security Manager 的时候,JDK 仍赋予了它加载的程序 AllPermission。

我们一般可以使用下面方法获取父加载器,但是在通常的 JDK/JRE 实现中,扩展类加载器 getParent() 都只能返回 null。

public final ClassLoader getParent()

扩展类加载器(Extension or Ext Class-Loader)

负责加载我们放到 jre/lib/ext/ 目录下面的 jar 包,这就是所谓的 extension 机制。

该目录也可以通过设置 “java.ext.dirs”来覆盖。

应用类加载器(Application or App Class-Loader)

负责加载应用程序路径下的类/classpath、系统变量java.class.path或者环境变量classpath指定的类。

类加载机制的三个特征

双亲委派模型

不是所有类加载都遵守这个模型

有的时候,启动类加载器所加载的类型,是可能要加载用户代码的,比如 JDK 内部的 ServiceProvider/ServiceLoader机制,用户可以在标准 API 框架上,提供自己的实现,JDK 也需要提供些默认的参考实现。
例如,Java 中 JNDI、JDBC、文件系统、Cipher 等很多方面,都是利用的这种机制,这种情况就不会用双亲委派模型去加载,而是利用所谓的上下文加载器。

具体可以参考我的这篇博客——哪些情况下类加载不需要遵守双亲委派模型?

可见性

子类加载器可以访问父加载器加载的类型,但是反过来是不允许的,不然,因为缺少必要的隔离,我们就没有办法利用类加载器去实现容器的逻辑。

单一性

由于父加载器的类型对于子加载器是可见的,所以父加载器中加载过的类型,就不会在子加载器中重复加载。
但是注意,类加载器“邻居”间,同一类型仍然可以被加载多次,因为互相并不可见。

双亲委派模型是什么?相关推荐

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

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

  2. ClassLoader的双亲委派模型

    类加载器用以实现类加载功能,并且确定被加载的类在Java虚拟机中的唯一性. 注意:由同一个类加载器加载,则这两个类相等,由不同的类加载器加载,则这两个类不相等. 我们知道类加载器主要分为: 启动类加载 ...

  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.类的加 ...

  10. Android插件化开发基础之Java类加载器与双亲委派模型

    类加载器 Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需 ...

最新文章

  1. WinForm 曲线图控件
  2. transfer 全平台Windows linux mac配置文件转换工具
  3. linux lvm添加磁盘,Linux下添加磁盘创建lvm分区
  4. Go worker并发模式
  5. myeclipse5.5注册码
  6. 典型瀑布模型四个阶段_古典瀑布模型的不同阶段
  7. spring-data-JPA使用JpaRepository注解自定义SQL查询数据库多表查询
  8. java中的位移运算符_java中的移位运算符(, , )
  9. 2018-03-28 从人机交互角度看中文编程:#39;打开微信#39;
  10. threejs 纹理流动_ThreeJs 认识纹理
  11. 谈谈我们的学习和我们的Blog
  12. linux下pwd命令学习
  13. Javascript特效:简单日历
  14. Qt多语言翻译(国际化)
  15. 如何完成企业舆情监测——话题检测与跟踪
  16. OpenGL 头文件,库文件
  17. STM32 FSMC 16位寻址 地址移位的解读
  18. strcmp函数的C语言实现
  19. MySQL:使用SQL语句删除所有索引
  20. HDU 5976 Detachment 题解(贪心+逆元+前缀和,积)

热门文章

  1. 区块链技术 ——区块链概述
  2. Python 小试牛刀
  3. 练手必备,20个Python实战项目含源代码
  4. 计算机一级 单元格尺寸设置,如何调整设置excel表格单元格大小一样大
  5. 谈谈我的框架设计经验
  6. 红米无线连接服务器,电脑无线连接红米手机远程管理启动技巧
  7. Linux摄像头UVC驱动第五篇--启动传输之设置摄像头参数
  8. A. Binary Decimal acii码 字符 数字的转换 vector容器 sort 排序
  9. 我学习从事项目经理第五课
  10. Linux下ll命令