类的加载是由类加载器完成的,类加载器包括:根加载器( BootStrap )、扩展加载器( Extension )、系统加载器( System )和用户自定义类加载器( java.lang.ClassLoader 的子类)。从 Java 2 ( JDK 1.2 )开始,类加载过程采取了父亲委托机制(PDM )。 PDM 更好的保证了 Java 平台的安全性,在该机制中, JVM 自带的 Bootstrap 是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。 JVM 不会向 Java 程序提供对 Bootstrap 的引用。

1Bootstrap ClassLoader
负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类
2Extension ClassLoader
负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包
3App ClassLoader
负责记载classpath中指定的jar包及目录中class
4Custom ClassLoader
属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader
加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
比较两个类是否相等,只有这两个类是由同一个类加载器加载才有意义。否则,即使这两个类是来源于同一个Class文件,只要加载它们的类加载器不同,那么这两个类必定不相等。

1. 什么是类加载器?

把类加载的过程放到Java虚拟机外部去实现,让应用程序决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。

2. 有哪些类加载器,分别加载哪些类

类加载器按照层次,从顶层到底层,分为以下三种: 
(1)启动类加载器 : 它用来加载 Java 的核心库,比如String、System这些类 
(2)扩展类加载器 : 它用来加载 Java 的扩展库。

(3) 应用程序类加载器 : 负责加载用户类路径上所指定的类库,一般来说,Java 应用的类都是由它来完成加载的。

3. 双亲委派模型

我们应用程序都是由以上三种类加载器互相配合进行加载的,还可以加入自己定义的类加载器。称为 类加载器的双亲委派模型 ,这里类加载器之间的父子关系一般不会以继承的关系来实现,而是都使用 组合关系 来复用父加载器的。

4. 双亲委托模型的工作原理

是当一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法加载这个加载请求的时候,子加载器才会尝试自己去加载。

5. 使用双亲委派模型好处?(原因)

第一:可以避免重复加载,当父亲已经加载了该类的时候,子类不需要再次加载。

第二:考虑到安全因素,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的类装载器。

转载于:https://www.cnblogs.com/lyr612556/p/7820172.html

随笔18 java中的类加载器相关推荐

  1. java中的类加载器有,Java自定义的类加载器,java自定义加载,在java中类加载器有以...

    Java自定义的类加载器,java自定义加载,在java中类加载器有以 在java中类加载器有以下几种java虚拟机自带的加载器 1)根类加载器(Bootstrap,c++实现)2)扩展类加载器(Ex ...

  2. 通过这一篇文章,可以把Java中的类加载器了解的七七八八了

    对于每个开发人员来说,java.lang.ClassNotFoundExcetpion这个异常几乎都遇到过,而追求其该异常的来源的话,就免不了谈一谈Java的类加载器了.本文就基于启动类加载器.扩展类 ...

  3. Java中的类加载器(ClassLoader)及类的加载机制

    类加载器就是用来将class文件加载到内存中的一个java类! 系统默认有三个类加载器! ①BootStrap:这不是java类,是java虚拟机在启动的时候加载的第一个类,这个加载器用来加载核心类, ...

  4. jdk类加载器执行步骤_[JDK 11] jcmd中的类加载器层次结构详细信息

    jdk类加载器执行步骤 自从在JavaOne 2012上听说 jcmd以来,我就一直是命令行诊断工具jcmd的 粉丝 . 从那时起,我已经广泛使用了此工具,并多次在此博客中发布过此工具: jcmd:一 ...

  5. [JDK 11] jcmd中的类加载器层次结构详细信息

    自从在JavaOne 2012上听说 jcmd以来,我就一直是命令行诊断工具jcmd的 粉丝 . 从那时起,我已广泛使用此工具,并多次在此博客中发布过此工具: jcmd:一个可以全部统治的JDK命令行 ...

  6. 【Android 逆向】加壳的 Android 应用启动流程 | 使用反射替换 LoadedApk 中的类加载器流程

    文章目录 一.加壳的 Android 应用启动流程 二.使用反射替换 LoadedApk 中的类加载器流程 一.加壳的 Android 应用启动流程 加壳的 Android 应用启动流程 : 加壳的 ...

  7. Java基础:类加载器

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 什么是类加载器 类加载器就是用来加载类的东西!类加载器也是一个类:ClassLoader 类加载 ...

  8. tomcat jar包_tomcat学习|tomcat中的类加载器

    开头说两句 小刀博客: http://www.lixiang.red 小刀公众号: 程序员学习大本营 学习背景 上期我们聊到了tomcat中各个组件在默认值,在其中,我们看到了有关类加载器的代码, 如 ...

  9. tomcat jar包编译后变成文件夹_tomcat学习|tomcat中的类加载器

    开头说两句 小刀博客: https://www.lixiang.red 小刀公众号: 程序员学习大本营 学习背景 上期我们聊到了tomcat中各个组件在默认值,在其中,我们看到了有关类加载器的代码, ...

最新文章

  1. 99%网工都会遇到的10道经典面试问题
  2. 币对交易所_比特币向1万4大涨,OK交易所的比特币为什么反而贬值7折?
  3. 20应用统计考研复试要点(part28)--简答题
  4. 数据结构作业1 讲解和拓展
  5. 大数据(2)---Hadoop由哪几部分组成?
  6. 春节档总票房已破50亿 电影票一票难求
  7. Tomcat与JDK版本对应关系
  8. 看博客学学Android(二十一)
  9. 对于C语言可移植性的思考
  10. C语言随机生成26个字母,菜鸟求助,写一个随机输出26个英文字母的程序
  11. Apache 优化配置10条建议
  12. GIMP教程 2 文字工具
  13. windows 窗口帧率监控小工具
  14. 编译原理-第四版-刘铭---期末复习
  15. linux下的经典软件总结
  16. 云上财务经营的成本管理
  17. 特殊教育学校计算机教学计划,2017年特殊教育学校教学计划
  18. jQuery项目:京东商品详情页
  19. 微型计算机第十一章答案,计算机习题答案总.docx
  20. design contains shelved or modified (but not repoured) polygons. the result....继续铺铜还是报警,解决方案如下:

热门文章

  1. maven3.5.0在win10中的安装及环境变量配置
  2. 几个书本上不常见到的C语言函数
  3. 数据备份基础之备份类型
  4. vue中如何使用mockjs摸拟接口的各种数据
  5. python之异常处理
  6. (树)判断二叉树是否为BST
  7. Scrum项目1.0
  8. Spring中自己主动装配
  9. Redhate5.4下Oracle 11g安装
  10. 开源项目JacpFX