双亲委派模型是什么?
写在前面
本文隶属于专栏《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 等很多方面,都是利用的这种机制,这种情况就不会用双亲委派模型去加载,而是利用所谓的上下文加载器。
具体可以参考我的这篇博客——哪些情况下类加载不需要遵守双亲委派模型?
可见性
子类加载器可以访问父加载器加载的类型,但是反过来是不允许的,不然,因为缺少必要的隔离,我们就没有办法利用类加载器去实现容器的逻辑。
单一性
由于父加载器的类型对于子加载器是可见的,所以父加载器中加载过的类型,就不会在子加载器中重复加载。
但是注意,类加载器“邻居”间,同一类型仍然可以被加载多次,因为互相并不可见。
双亲委派模型是什么?相关推荐
- 分析JVM双亲委派模型的类加载源码 自定义类加载器
双亲委派模型下,在父类加载器无法加载的情况下再由当前类加载器去加载.具体的实现逻辑在java.util.ClassLoader抽象类的loadClass方法中.在该方法中,先检查是否已经加载过,如果没 ...
- ClassLoader的双亲委派模型
类加载器用以实现类加载功能,并且确定被加载的类在Java虚拟机中的唯一性. 注意:由同一个类加载器加载,则这两个类相等,由不同的类加载器加载,则这两个类不相等. 我们知道类加载器主要分为: 启动类加载 ...
- java 打破双亲委派,为什么说java spi破坏双亲委派模型?
虽然有SPI破坏双亲委派模型的说法,但我不太认同.简单说下. 双亲委派模型(再次吐槽下这个翻译),是一种加载类的约定.这个约定的一个用处是保证安全.比如说你写Java用了String类,你怎么保证你用 ...
- jvm:类加载器与双亲委派模型
两个类相等需要类本身相等,并且使用同一个类加载器进行加载.这是因为每一个类加载器都拥有一个独立的类名称空间. 这里的相等,包括类的 Class 对象的 equals() 方法.isAssignable ...
- amba simple class驱动_学习笔记:class加载器和双亲委派模型
类加载器 类加载器有四种 启动类加载器(Bootstrap ClassLoader) 负责加载 JAVA_HOMElib ⽬录中的,或通过-Xbootclasspath参数指定路径中的且被虚拟机认可( ...
- 面向对象回顾(静态变量、类加载机制/双亲委派模型、Object类的方法、类和对象区别)
1. 静态变量存在什么位置? 方法区 2. 类加载机制,双亲委派模型,好处是什么? 某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务, ...
- 类加载器、双亲委派模型
目录 1.简介 2.类和类加载器 3.双亲委派模型 3.1 启动类加载器: 3.2 扩展类加载器 3.3应用程序类加载器 3.4 类加载器的双亲委派模型(Parents Delegation Mod ...
- Java虚拟机:对象创建过程与类加载机制、双亲委派模型
一.对象的创建过程: 1.对象的创建过程: 对象的创建过程一般是从 new 指令(JVM层面)开始的,整个创建过程如下: (1)首先检查 new 指令的参数是否能在常量池中定位到一个类的符号引用: ( ...
- 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器
28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...
- Android插件化开发基础之Java类加载器与双亲委派模型
类加载器 Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需 ...
最新文章
- WinForm 曲线图控件
- transfer 全平台Windows linux mac配置文件转换工具
- linux lvm添加磁盘,Linux下添加磁盘创建lvm分区
- Go worker并发模式
- myeclipse5.5注册码
- 典型瀑布模型四个阶段_古典瀑布模型的不同阶段
- spring-data-JPA使用JpaRepository注解自定义SQL查询数据库多表查询
- java中的位移运算符_java中的移位运算符(, , )
- 2018-03-28 从人机交互角度看中文编程:#39;打开微信#39;
- threejs 纹理流动_ThreeJs 认识纹理
- 谈谈我们的学习和我们的Blog
- linux下pwd命令学习
- Javascript特效:简单日历
- Qt多语言翻译(国际化)
- 如何完成企业舆情监测——话题检测与跟踪
- OpenGL 头文件,库文件
- STM32 FSMC 16位寻址 地址移位的解读
- strcmp函数的C语言实现
- MySQL:使用SQL语句删除所有索引
- HDU 5976 Detachment 题解(贪心+逆元+前缀和,积)