一、什么是双亲委派机制?

当某个特定的类加载器它在接到需要加载类的请求时,这个类会首先查看自己已加载完的类中是否包含这个类,如果有就返回,没有的话就会把加载的任务交给父类加载器加载,以此递归,父类加载器如果可以完成类加载任务,就返回它,当父类加载器无法完成这个加载任务时,才会不得已自己去加载。这种机制就叫做双亲委派机制。

工作机制

类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件。在Java中,类装载器把一个类装入JVM中,要经过以下步骤:

1) 装载:查找和导入Class文件;

2) 链接:把类的二进制数据合并到JRE中;

(a)校验:检查载入Class文件数据的正确性;

(b)准备:给类的静态变量分配存储空间;

(c)解析:将符号引用转成直接引用;

3) 初始化:对类的静态变量,静态代码块执行初始化操作

类加载器与双亲委派模型

类加载器

1) Bootstrap ClassLoader :

将存放于lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar

名字不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被Java程序直接引用

2) Extension ClassLoader :

将libext目录下的,或者被java.ext.dirs系统变量所指定的路径中的所有类库加载。开发者可以直接使用扩展类加载器。

3) Application ClassLoader : 负责加载用户类路径(ClassPath)上所指定的类库,开发者可直接使用。

双亲委派模型

工作过程:类加载器接收类加载的请求,先把请求委托给父类加载器去完成,所有层次的类加载器都是如此,因此所有的加载请求都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。

反射

Reflection机制允许程序在正在执行的过程中,利用Reflection APIs获取任何已知名称的类的内部信息,并能够在执行过程中,动态生成instances、变更fields内容或唤起methods。

二、为什么要使用双亲委派机制?

  1. 首先明确一点:jvm如何认定两个对象同属于一个类型,必须同时满足下面两个条件:
  • 都是用同名的类完成实例化的。
  • 两个实例各自对应的同名的类的加载器必须是同一个。比如两个相同名字的类,一个是用系统加载器加载的,一个扩展类加载器加载的,两个类生成的对象将被jvm认定为不同类型的对象。

java虚拟机只会在不同的类的类名相同且加载该类的加载器均相同的情况下才会判定这是一个类。如果没有双亲委派机制,同一个类可能就会被多个类加载器加载,如此类就可能会被识别为两个不同的类,相互赋值时问题就会出现。

双亲委派机制能够保证多加载器加载某个类时,最终都是由一个加载器加载,确保最终加载结果相同。

没有双亲委派模型,让所有类加载器自行加载的话,假如用户自己编写了一个称为java.lang.Object的类,并放在程序的ClassPath中,系统就会出现多个不同的Object类,

Java类型体系中基础行为就无法保证,应用程序就会变得一片混乱。

三,能不能自己写个类叫java.lang.System?

答案:通常不可以,但可以采取另类方法达到这个需求。

解释:为了不让我们写System类,类加载采用委托机制,这样可以保证爸爸们优先,爸爸们能找到的类,儿子就没有机会加载。而System类是Bootstrap加载器加载的,就算自己重写,也总是使用Java系统提供的System,自己写的System类根本没有机会得到加载。
但是,我们可以自己定义一个类加载器来达到这个目的,为了避免双亲委托机制,这个类加载器也必须是特殊的。由于系统自带的三个类加载器都加载特定目录下的类,如果我们自己的类加载器加载一个特殊的目录,那么系统的加载器就无法加载,也就是最终还是由我们自己的加载器加载

四、破坏双亲委派

4.1、为什么需要破坏双亲委派?

因为在某些情况下父类加载器需要委托子类加载器去加载class文件。受到加载范围的限制,父类加载器无法加载到需要的文件,以Driver接口为例,由于Driver接口定义在jdk当中的,而其实现由各个数据库的服务商来提供,比如mysql的就写了MySQL Connector,那么问题就来了,DriverManager(也由jdk提供)要加载各个实现了Driver接口的实现类,然后进行管理,但是DriverManager由启动类加载器加载,只能记载JAVA_HOME的lib下文件,而其实现是由服务商提供的,由系统类加载器加载,这个时候就需要启动类加载器来委托子类来加载Driver实现,从而破坏了双亲委派,这里仅仅是举了破坏双亲委派的其中一个情况。

4.2,如何破坏双亲委派机制原则

双亲委派机制原则在loadclass方法中。
只需要绕开loadclass方法中即可。

1.自定义类加载器 ,重写loadclass方法
2, SPI机制绕开loadclass 方法。当前线程设定关联类加载器。

SPI原理:类加载器如何打破双亲委派加载机制(SPI原理) - SegmentFault 思否

为什么使用双亲委派机制以及如何破坏双亲委派相关推荐

  1. 【有料】面试必备:什么时候要打破双亲委派机制?什么是双亲委派? (图解+秒懂+史上最全)

    面试题:什么时候要打破双亲委派机制 来自社群的两个面试题,其实也是两个基础的 面试题,大家一定要掌握 社群问题: 先说下第一题的结论 场景1: 如果委托类没有实现接口的话,就不能使用newProxyI ...

  2. android双亲委派机制,类加载器及双亲委派机制

    一. 类的加载 java class是由class loader 类加载器加载到JVM内存中的. 看下下面的demo,java中有三种类加载器. 首先,我们自己定义的这个classLoaderDemo ...

  3. 面试必备:什么时候要打破双亲委派机制?什么是双亲委派? (图解+秒懂+史上最全)

    文章很长,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 ...

  4. 【JVM】双亲委派机制详解

    通过上篇文章我们学习了类加载,也提到了因为双亲委派机制的存在自定义类加载器的实现,不要去覆盖ClassIoader类的loadClass方法,去实现findClass方法,接下来详细解释一下双亲委派机 ...

  5. JVM(1)之JVM的组成详解(字符串常量池+双亲委派机制+JIT即时编译......)

    以下总结自:<深入理解java虚拟机> + 宋红康老师视频 字节码文件介绍:深入理解JVM之Java字节码(.class)文件详解_Windy_729的博客-CSDN博客_字节码文件 JV ...

  6. 详解JVM之双亲委派机制

    双亲委派机制 定义 如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就成功返回.只有父类加载 ...

  7. java 双亲委派_JVM双亲委派机制与Tomcat

    双亲委派模型与JVM 类加载 讲个故事: 以前,爱捣鼓的小明突然灵机一动,写出了下面的代码 package java.lang; /** * @author dengchengchao * @date ...

  8. Java虚拟机-双亲委派机制

    文章目录 双亲委派机制概述 双亲委派机制原理 双亲委派机制的优势 沙箱安全机制 破坏双亲委派机制 双亲委派机制概述 Java虚拟机对class文件采用按需加载的方式,也就是说当需要使用该类时,才会将它 ...

  9. 从源码探究双亲委派机制

    文章内容引用自 咕泡科技 咕泡出品,必属精品 首先我们要知道双亲委派机制是为了解决什么问题? 双亲委派机制的目的: 为了安全,保证核心类库的安全性,防止被篡改,以及保证类的唯一 怎么保证类的唯一呢? ...

最新文章

  1. C#学习笔记8:HTML和CSS基础学习笔记
  2. gdb+gdbserver
  3. ContextCompat.checkSelfPermission()方法中的第二个参数
  4. codeforce gym 100548H The Problem to Make You Happy
  5. 删除Win7通知区域的无效图标
  6. git中如何提交空目录
  7. px2rem 第三方库实践
  8. 老人机java游戏模拟器_JAVA手机软件模拟工具|JAVA手机游戏模拟器(KEmulator)下载_1.0 免安装版_9号软件下载...
  9. MySQL安装(详细,适合小白)
  10. PFPLD 人脸关键点检测
  11. JS图片压缩+图片上传前检测类型、大小、尺寸
  12. 虚拟机中ip地址总是自动变化解决办法
  13. Echats给柱状图及提示文字添加百分号(%)的解决办法
  14. 享元模式——滴滴打车的共享经济思维
  15. 牙齿矫正需要注意哪些事项?
  16. 计算机服务器属无形资产吗,服务器属于固定资产还是无形资产
  17. 测试面试题——三角形
  18. jacob的使用方法总结
  19. 【转】14年从业老兵分享万字长文MMO成功秘诀
  20. textView 的设置文本中某一文字的字体颜色以及图文混排

热门文章

  1. IDS与IPS工作原理
  2. 泛型类、泛型方法的使用与理解
  3. 罗克韦尔自动化通过收购ASEM加强控制和可视化产品组合
  4. Windows漏洞修复服务器,三种Windows服务器SSL/TLS的安全漏洞以及其补救方法
  5. 西电操作系统上机实验2
  6. 墨珩科技超衡联盟链通过中国赛宝实验室测试
  7. python多线程详解 Python 垃圾回收机制
  8. 8.mysql备份恢复
  9. 强烈推荐!几款windows效率工具,文件查找、资源管理器标签化,效率控必备
  10. Bug heroes虫虫英雄······超详细翻译+基本攻略