类加载器

类加载器有四种

  • 启动类加载器(Bootstrap ClassLoader)

负责加载 JAVA_HOMElib ⽬录中的,或通过-Xbootclasspath参数指定路径中的且被虚拟机认可(按⽂件名识别,如rt.jar)的类。这个加载器由C++实现的,并不是java实现的

  • 扩展类加载器(Extension ClassLoader)

负责加载 JAVA_HOMElibext ⽬录中的,或通过java.ext.dirs系统变量指定路径中的类库。

  • 应⽤程序类加载器(Application ClassLoader)

负责加载⽤户路径(classpath)上的类库

  • 自定义加载器(User ClassLoader)

JVM⾃带的三个加载器只能加载指定路径下的类字节码,如果某个情况下,我们需要加载应⽤程序之外的类⽂件呢?⽐如本地D盘下的,或者去加载⽹络上的某个类⽂件,这种情况就可以使⽤⾃定义加载器了。

自定义加载器的步骤,(1)继承ClassLoader ——>(2)重写findClass()⽅法 ——>(3)调⽤defineClass()⽅法

加载器

JVM的类加载器是通过ClassLoader及其⼦类来完成的,类的层次关系和加载顺序可以由下图来描述

加载过程中会先检查类是否被已加载,检查顺序是⾃底向上,从Custom ClassLoader到BootStrapClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载⼀次。⽽加载的顺序是⾃顶向下,也就是由上层来逐层尝试加载此类。

双亲委派模型

JVM通过双亲委派模型进⾏类的加载,当⼀个类加载器收到类加载任务,会先交给其⽗类加载器去完成,因此最终加载任务都会传递到顶层的启动类加载器,只有当⽗类加载器⽆法完成加载任务时,才会尝试执⾏加载任务。

这样可以避免重复加载,当⽗亲已经加载了该类的时候,就没有必要⼦ClassLoader再加载⼀次。

我们可以想一下,若是不这么做,那我们就可以随时使⽤⾃定义的String来动态替代java核⼼api中定义的类型,这样会存在⾮常⼤的安全隐患,⽽双亲委托的⽅式,就可以避免这种情况,因为String已经在启动时就被引导类加载器(Bootstrcp ClassLoader)加载,所以⽤户⾃定义的ClassLoader永远也⽆法加载⼀个⾃⼰写的String,除⾮你改变JDK中ClassLoader搜索类的默认算法。

破坏双亲委派模型

在某些情况下⽗类加载器需要加载的class⽂件由于受到加载范围的限制,⽗类加载器⽆法加载到需要的⽂件,这个时候就需要委托⼦类加载器进⾏加载。

但是按照双亲委派模式,⼦类需要委托⽗类加载器去加载class⽂件。无疑是没法达到我们的目的地。这个时候就需要破坏双亲委派模式才能加载成功⽗类加载器需要的类。就需要⽗类会委托⼦类去加载它需要的class⽂件。

比如 jdk 中定义的 Driver 接⼝,但它的实现由在各大数据库的服务商来提供,像mysql的就写了MySQL Connector ,这些实现类都是以jar包的形式放到classpath⽬录下。

so,问题就来了,DriverManager(也由jdk提供)要加载各个实现了Driver接⼝的实现类(classpath下),然后进⾏管理,但是DriverManager由启动类加载器加载,只能加载JAVA_HOME的lib下⽂件,⽽其实现是由服务商提供的,在classpath目录下,由系统类加载器加载,这个时候就需要启动类加载器来委托⼦类来加载Driver实现,从⽽破坏了双亲委派。这⾥仅仅是举了破坏双亲委派的其中⼀个情况。

大家还有其他破坏双亲委派模型的例子不,可以留言分享一下。

个人学习整理,有错欢迎纠正

amba simple class驱动_学习笔记:class加载器和双亲委派模型相关推荐

  1. JVM学习笔记-03-类加载器及双亲委派机制

    JVM学习笔记-03-类加载器及双亲委派机制 文章目录 JVM学习笔记-03-类加载器及双亲委派机制 1. 类加载器 视频链接-最新JVM教程IDEA版[Java面试速补篇]-03-类加载器及双亲委派 ...

  2. node学习笔记--模块加载

    学习笔记过程,自己理解,方便自己查询,新手一枚,希望批评指正. 使用 webstrom 编辑器 可以将安装的node.exe 配置进去,直接运行,可自行百度配置. 通过命令行参数传递给NodeJS以启 ...

  3. Node.js学习笔记——模块加载机制及npm指令详解

    文章目录 二.模块化 1.模块化的基本概念 2.Node.js 中的模块化 Node.js 中模块的分类 加载模块 Node.js 中的模块作用域 向外共享模块作用域中的成员 Node.js 中的模块 ...

  4. java的双亲委派_深入理解Java的类加载器及双亲委派机制

    当我们在写完一个Java文件的时候,编译器会将.java文件编译成.class文件,然后当程序运行时,JVM首先会找到main方法所在类,并将main所在类的class文件字节码读到内存中,转换成JV ...

  5. androidstudio4.1.1 build model卡主_在C++中加载PyTorch1.4的FasterRCNN模型

    千呼万唤始出来 在PyTorch的1.4版本和torchvision的0.5.0版本中,PyTorch可以直接使用libtorch加载FasterRCNN等模型.之前版本支持仅包含conv等网络层模型 ...

  6. java 委托原则_为什么说 Java SPI 的设计违反双亲委派原则

    一.双亲委派模型 1.类加载器可以细分为如下三类 启动类加载器(Bootstrap ClassLoader),负责将所有存放在\lib目录中的,或者被-Xbootclasspath参数所指定路径中,并 ...

  7. Android深度探索(卷1)HAL与驱动开发学习笔记(8)

    Android深度探索(卷1)HAL与驱动开发学习笔记(8) 第八章 蜂鸣器驱动   L i n u x驱动的代码重用有很多种方法.可以采用标准C程序的方式.将要重用的代码放在其他的文件(在头文件中声 ...

  8. Windows驱动开发学习笔记(七)—— 多核同步内核重载

    Windows驱动开发学习笔记(七)-- 多核同步 基础知识 并发与同步 分析 InterlockedIncrement 原子操作相关API 内核文件 多核同步 临界区 示例一:错误的临界区 示例二: ...

  9. Windows驱动开发学习笔记(六)—— Inline HOOK

    Windows驱动开发学习笔记(六)-- Inline HOOK SSDT HOOK Inline Hook 挂钩 执行流程 脱钩 实验一:3环 Inline Hook 实验二:0环 Inline H ...

最新文章

  1. 必须为元素类型 association 声明属性 oftype。_CSS相关的选择器和属性介绍
  2. 设计模式 之 装饰者模式
  3. 《R语言游戏数据分析与挖掘》一导读
  4. 移相全桥 matlab仿真,MATLAB中的SISOTOOL在数字式移相全桥中的应用
  5. windos 为什么会突然服务停止了_Windows服务异常自动关闭
  6. wxWidgets:wxRichTextCtrl类用法
  7. Android 根据Uri删除文件
  8. Mockito框架代码学习调试
  9. 高斯核函数参数确定_高斯过程
  10. matlab中基于cdma的锁相环,答辩-基于MATLAB的CDMA通信系统设计与仿真.ppt
  11. linux 添加路由_在 Linux 上使用开源软件创建 SDN | Linux 中国
  12. 《消费者报告》下调特斯拉Model 3安全评级
  13. if....else的基本用法
  14. F7-Nginx虚拟主机Server
  15. 机器学习--详解基于梯度下降的Logistic回归算法原理
  16. 控制台应用程序《石头剪刀布》——新手,
  17. VM 虚拟机 分辨率问题
  18. taobao.trades.sold.get-查询卖家已卖出的交易数据API接口,店铺交易API接口,店铺订单交易API接口,订单详情API接口,r2接口,淘宝oAuth2.0接口
  19. Enterprise Architect安装包及教程
  20. Javascript学习大纲

热门文章

  1. Intel Realsense 使用D435时需安装的几款官方软件
  2. python2.7配置tensorflow1.5.0和keras2.1.6
  3. JVM命令查看与设置参数
  4. Elasticsearch Suggester搜索建议详解
  5. python中 和is的区别_关于python中的is和==的区别
  6. 每天学一点儿shell:linux中时间函数的date的用法
  7. SpringBoot的全局异常处理的优雅吃法!要进来学习下吗
  8. java window 路径_关于windows的绝对路径在java中的疑惑~求解
  9. java e7 e9格式怎么转_java�?e7?a8??e9?a8�ӿ�
  10. QString之arg用法