两个类相等需要类本身相等,并且使用同一个类加载器进行加载。这是因为每一个类加载器都拥有一个独立的类名称空间。

这里的相等,包括类的 Class 对象的 equals() 方法、isAssignableFrom() 方法、isInstance() 方法的返回结果为 true,也包括使用 instanceof 关键字做对象所属关系判定结果为 true。

类加载器分类

从 Java 虚拟机的角度来讲,只存在以下两种不同的类加载器:

  • 启动类加载器(Bootstrap ClassLoader),这个类加载器用 C++ 实现,是虚拟机自身的一部分;

  • 所有其他类的加载器,这些类由 Java 实现,独立于虚拟机外部,并且全都继承自抽象类 java.lang.ClassLoader。

从 Java 开发人员的角度看,类加载器可以划分得更细致一些:

  • 启动类加载器(Bootstrap ClassLoader)此类加载器负责将存放在 <JRE_HOME>\lib 目录中的,或者被 -Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar,名字不符合的类库即使放在 lib 目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被 Java 程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给启动类加载器,直接使用 null 代替即可。

  • 扩展类加载器(Extension ClassLoader)这个类加载器是由 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将 <JAVA_HOME>/lib/ext 或者被 java.ext.dir 系统变量所指定路径中的所有类库加载到内存中,开发者可以直接使用扩展类加载器。

  • 应用程序类加载器(Application ClassLoader)这个类加载器是由 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。由于这个类加载器是 ClassLoader 中的 getSystemClassLoader() 方法的返回值,因此一般称为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

双亲委派模型

应用程序都是由三种类加载器相互配合进行加载的,如果有必要,还可以加入自己定义的类加载器。

下图展示的类加载器之间的层次关系,称为类加载器的双亲委派模型(Parents Delegation Model)。该模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器。这里类加载器之间的父子关系一般通过组合(Composition)关系来实现,而不是通过继承(Inheritance)的关系实现。

1. 工作过程

一个类加载器首先将类加载请求传送到父类加载器,只有当父类加载器无法完成类加载请求时才尝试加载。

2. 好处

使得 Java 类随着它的类加载器一起具有一种带有优先级的层次关系,从而使得基础类得到统一。

优先级:通过启动类加载器加载的类 > 扩展类加载器加载的类 > 应用程序加载器加载的类

例如 java.lang.Object 存放在 rt.jar 中,如果编写另外一个 java.lang.Object 的类并放到 ClassPath 中,程序可以编译通过。由于双亲委派模型的存在,所以在 rt.jar 中的 Object 比在 ClassPath 中的 Object 优先级更高,这是因为 rt.jar 中的 Object 使用的是启动类加载器,而 ClassPath 中的 Object 使用的是应用程序类加载器。rt.jar 中的 Object 优先级更高,因此在各种类加载器环境中都是同一个类。

每一个类,都需要由加载它的类加载器和类本身来确定其在JVM中的唯一性


jvm:类加载器与双亲委派模型相关推荐

  1. JVM 类加载器与双亲委派模型

    1. 类加载器 我们知道,虚拟机在加载类的过程中需要使用类加载器进行加载,而在 Java 中,类加载器有很多,那么当 JVM 想要加载一个 .class 文件的时候,到底应该由哪个类加载器加载呢?这时 ...

  2. JVM—类加载器和双亲委派模型

    关注微信公众号:CodingTechWork,一起工作学习总结. 文章目录 引言 类加载器 类与类加载器关系 类加载器分类 启动类加载器 扩展类加载器 应用程序类加载器 双亲委派模型 介绍 工作流程 ...

  3. 【深入理解JVM】:类加载器与双亲委派模型

    转载自  [深入理解JVM]:类加载器与双亲委派模型 类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段" ...

  4. 类加载器、双亲委派模型

    目录 1.简介 2.类和类加载器 3.双亲委派模型 3.1 启动类加载器: 3.2 扩展类加载器 3.3应用程序类加载器 3.4  类加载器的双亲委派模型(Parents Delegation Mod ...

  5. Android插件化开发基础之Java类加载器与双亲委派模型

    类加载器 Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需 ...

  6. 双亲委托类加载机制_图解JVM类加载机制和双亲委派模型

    我们都知道以 .java 结尾的 Java 源文件,经过编译之后会变成 .class 结尾的字节码文件.JVM 通过类加载器来加载字节码文件,然后再执行程序. 什么时候加载一个类 那么,什么时候类加载 ...

  7. JVM 类加载机制及双亲委派模型

    一 .整体的流程 Java 中的所有类,必须被装载到 jvm 中才能运行,这个装载工作是由 jvm 中的类加载器完成的,类加载器所做的工作实质是把类文件从硬盘读取到内存中,JVM 在加载类的时候,都是 ...

  8. 类加载器以及双亲委派模型

    Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制. 自JDK1.2以来,Java ...

  9. 类加载器和双亲委派模型

    虚拟机设计团队有意把类加载阶段中的"通过一个类的全限定名来获取描述该类的二进制字节流"这个动作放到java虚拟机外部去实现,以便让应用程序自己决定获取所需的类.实现这个动作的代码被 ...

最新文章

  1. Spread for Windows Forms高级主题(5)---数据处理
  2. 上市后首份年报亮眼,快手天花板在哪?
  3. GMQ集团推出全球创新型金融衍生品交易平台
  4. 普通程序员,光靠GitHub打赏就年入70万,要不你也试试
  5. jquery-绑定事件与解除事件的绑定
  6. .NET程序在运行中创建EXE文件的技术
  7. android调用文件管理器回调,Android中调用系统管理器选择文件并返回绝对路径
  8. thinkphp模板常用的方法
  9. GridView导出Execl
  10. cyclone小知识(二)——cyclone加载扫描工程的数据
  11. python ca模块_[转]常用的python模块及安装方法
  12. 强子老师python_强子老师分享:深度分析维生素C
  13. 计算机二级考试内容是什么
  14. 分布式系统论文精读2:GFS
  15. Swift减少print函数的耗费
  16. Word批量转TXT宏
  17. SNMP协议简单理解
  18. SAP 技术原理搬砖 - ARAP重分类:为啥我和外币评估设计原理不一样?
  19. 详细的springboot整合activeMq安装与使用(上)
  20. 爬虫系列:得物、京东、唯品会获得比价数据

热门文章

  1. spring mvc logback
  2. MATLAB中常用的排列、组合、阶乘函数
  3. 怎样推断一棵二叉树是全然二叉树
  4. 高性能Javascript:高效的数据访问
  5. DTS和PTS的解释(FFMPEG、HLS相关)
  6. Ubuntu16.04手工搭建emscripten编译环境
  7. vc++ 利用jmail组件收发邮件
  8. canvas 圆角矩形填充_Canvas:随机长方形生成和色块填充
  9. java插入flash_怎样可以把flash添加到Java应用程序
  10. weka: exhaustive search