JVM设计者把类加载阶段中的“通过'类全名'来获取定义此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。


1.类与类加载器

对于任何一个类,都需要由加载它的类加载器和这个类来确立其在JVM中的唯一性。也就是说,两个类来源于同一个Class文件,并且被同一个类加载器加载,这两个类才相等。

2.双亲委派模型

从虚拟机的角度来说,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),该类加载器使用C++语言实现,属于虚拟机自身的一部分。另外一种就是所有其它的类加载器,这些类加载器是由Java语言实现,独立于JVM外部,并且全部继承自抽象类java.lang.ClassLoader。


JDK 默认提供了如下几种ClassLoader

1.  Bootstrp loader

Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib,-Xbootclasspath参数指定的路径以及%JAVA_HOME%/jre/classes中的类。rt.jar

2.  ExtClassLoader

Bootstrploader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrploader,

ExtClassLoader是用Java写的,具体来说就是 sun.misc.Launcher$ExtClassLoader,ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext,此路径下的所有classes目录以及java.ext.dirs系统变量指定的路径中类库。

3.  AppClassLoader

Bootstrploader加载完ExtClassLoader后,就会加载AppClassLoader,并且将AppClassLoader的父加载器指定为ExtClassLoader。AppClassLoader也是用Java写成的,它的实现类是sun.misc.Launcher$AppClassLoader,另外我们知道ClassLoader中有个getSystemClassLoader方法,此方法返回的正是AppclassLoader.AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档,它也是Java程序默认的类加载器。


双亲委派机制的工作流程:

1. 当前ClassLoader首先从自己已经加载的类中查询是否此类已经加载,如果已经加载则直接返回原来已经加载的类。

每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存,等下次加载的时候就可以直接返回了。

2.  当前classLoader的缓存中没有找到被加载的类的时候,委托父类加载器去加载,父类加载器采用同样的策略,首先查看自己的缓存,然后委托父类的父类去加载,一直到bootstrp ClassLoader.

3.  当所有的父类加载器都没有加载的时候,再由当前的类加载器加载,并将其放入它自己的缓存中,以便下次有加载请求的时候直接返回。


总结:

“双亲委派”机制只是Java推荐的机制,并不是强制的机制。

我们可以继承java.lang.ClassLoader类,实现自己的类加载器。如果想保持双亲委派模型,就应该重写findClass(name)方法;如果想破坏双亲委派模型,可以重写loadClass(name)方法。具体细节建议看下源码

深入理解双亲委托机制相关推荐

  1. 类加载器双亲委托机制详解

    理论了解: 关于类加载器的双亲委托机制基本上都听说过,面试时可能偶尔也会被问到,但是可能都是网上去找了一个理论性的答案临时了解了一下,并未对它到底是个什么样的机制有深入的了解,所以接下来准备深入了解它 ...

  2. 如何快速写一个违背双亲委托机制的classloader

    很多情况下,不得以必须写个classloader来满足需求.例如你一个工程里你想用相同的数据库的多个版本,自己制定了一个jar包目录,没有classloader管理等等.如果是一个遵循java已经规定 ...

  3. java 整合hadoop_Spark 如何摆脱java双亲委托机制优先从用户jar加载类?

    1. 起源 spark的类加载及参数传递过程还是很复杂的,主要是因为他运行环境太复杂了,不同的集群管理器完全不一样,即使是同一集群管理器cluster和client也不一样,再加上这块探究还是需要一定 ...

  4. Java 类加载体系之 ClassLoader 双亲委托机制

    Java 类加载体系之 ClassLoader 双亲委托机制 java 是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件 ...

  5. 【Android 逆向】类加载器 ClassLoader ( 启动类加载器 | 扩展类加载器 | 应用类加载器 | 类加载的双亲委托机制 )

    文章目录 一.类加载器 二.类加载的双亲委托机制 一.类加载器 Java 虚拟机 ClassLoader 类加载器 : Bootstrap ClassLoader : 启动类加载器 , 该 加载器由 ...

  6. axure 富文本编辑器_Java的类加载器与双亲委托机制

    目录: 类加载器 java.lang.ClassLoader类 URLClassLoader与SecureClassLoader ClassLoader常见方法源码分析 双亲委托机制 图解 源码角度分 ...

  7. jvm之类加载双亲委托机制

    岁岁金河复玉关,不辞镜里望崔山.--唐代杜甫<春望> 双亲委托机制 双亲委托机制是指在类加载器加载类时,如果一个类加载器收到了加载请求,它首先将请求委托给父类加载器,如果父类加载器仍无法找 ...

  8. 打破双亲委派机制有什么用_被打破的双亲委托机制

    在介绍ClassLoader之前,先提几个问题: 1.新建一个java工程,创建一个Long类,在里面写上如下代码 package java.lang;public class Long { publ ...

  9. jvm十一:类加载器双亲委托机制

    在双亲委托机制中,各个加载器按照父子关系形成了树形结构,除了根类加载器之外,其余的类加载器都且只有一个父加载器. package com.atChina.jvm;import sun.awt.Symb ...

最新文章

  1. 生鲜电商APP开发,有哪五大商机?
  2. 【译】Swift算法俱乐部-查找最大/最小值
  3. 打破冷漠僵局文章_研究僵局–第1部分
  4. 微信硬件平台发布八大行业解决方案 成功细分着陆传统行业
  5. linux ntp端口 修改,Linux时间配置(修改时间 修改日期 ntpd ntpdate NTP socket exiting)...
  6. 关于Oracle10g归档参数的研究
  7. 【WPF】对Frame控件的Content属性做绑定时出现的一个小问题
  8. 宗地图绘制要求和规范_宗地图绘制的基本要求与内容.ppt
  9. python 视频培训
  10. 量化交易10-backtrader回测乌云盖顶K线形态图
  11. Python相似度计算【大总结】
  12. [唐诗]杳杳寒山道-寒山
  13. parent.layer.open打开的页面向上个页面传值
  14. 如何正确计算LINUX内存使用率
  15. MFRC522使用、设计心得及详细教程资料
  16. 方便、免费的PDF在线处理网站汇总:PDF合并、文字编辑、页面提取与删除、格式转换…
  17. C++中类成员和类继承的private、protected和public关键字作用
  18. JS 浮点数转整数的方法
  19. 数据分析师培训机构带你3分钟快速入门数据分析
  20. Windows下运行Hadoop

热门文章

  1. 那些年啊 那些事 一个程序员的奋斗史 121
  2. 2022-2028全球汽车压力传感器行业发展现状调研及投资前景分析报告
  3. java中expand用法_Rxjs expand的用法分析
  4. 软件测试基础:黑盒测试,白盒测试及具体方法
  5. 2022电大国家开放大学网上形考任务-公司财务非免费(非答案)
  6. pc企业微信hook接口 全功能
  7. 手办 android app,hpoi手办维基
  8. ORA-00257: archiver error. Connect internal only, until freed 的解决方法
  9. Springboot整合redis+jedis
  10. 热点事件情境下微博舆情反转预测