关闭

类加载机制:全盘负责和双亲委托

7077人阅读 评论(5) 收藏 举报
分类:

“全盘负责”是指当一个ClassLoader装载一个类时,除非显示地使用另一个ClassLoader,则该类所依赖及引用的类也由这个CladdLoader载入。

例如,系统类加载器AppClassLoader加载入口类(含有main方法的类)时,会把main方法所依赖的类及引用的类也载入,依此类推。“全盘负责”机制也可称为当前类加载器负责机制。显然,入口类所依赖的类及引用的类的当前类加载器就是入口类的类加载器。

以上步骤只是调用了ClassLoader.loadClass(name)方法,并没有真正定义类。真正加载class字节码文件生成Class对象由“双亲委派”机制完成。

“双亲委派”是指子类加载器如果没有加载过该目标类,就先委托父类加载器加载该目标类,只有在父类加载器找不到字节码文件的情况下才从自己的类路径中查找并装载目标类。

“双亲委派”机制加载Class的具体过程是:

  1. 源ClassLoader先判断该Class是否已加载,如果已加载,则返回Class对象;如果没有则委托给父类加载器。
  2. 父类加载器判断是否加载过该Class,如果已加载,则返回Class对象;如果没有则委托给祖父类加载器。
  3. 依此类推,直到始祖类加载器(引用类加载器)。
  4. 始祖类加载器判断是否加载过该Class,如果已加载,则返回Class对象;如果没有则尝试从其对应的类路径下寻找class字节码文件并载入。如果载入成功,则返回Class对象;如果载入失败,则委托给始祖类加载器的子类加载器。
  5. 始祖类加载器的子类加载器尝试从其对应的类路径下寻找class字节码文件并载入。如果载入成功,则返回Class对象;如果载入失败,则委托给始祖类加载器的孙类加载器。
  6. 依此类推,直到源ClassLoader。
  7. 源ClassLoader尝试从其对应的类路径下寻找class字节码文件并载入。如果载入成功,则返回Class对象;如果载入失败,源ClassLoader不会再委托其子类加载器,而是抛出异常。

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

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



4
0
查看评论

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

类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因。在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字节流,完成这个动作的代码块就是类加载器。这一动作是放在Java虚拟机外部去实现的,以便让应用程序自己...
  • u011080472
  • u011080472
  • 2016-05-06 19:09
  • 17509

java ClassLoader类解析-双亲委托机制

做Java开发,对于ClassLoader的机制是必须要熟悉的基础知识,本文针对Java ClassLoader的机制做一个简要的总结。因为不同的JVM的实现不同,本文所描述的内容均只限于Hotspot Jvm. 本文将会从JDK默认的提供的ClassLoader,双亲委托模型,如何自定义Class...
  • wangyang1354
  • wangyang1354
  • 2015-10-27 14:43
  • 7226

Classloader的双亲委托机制

· JVM自带的ClassLoader类 · 什么是双亲委托模型 · 双亲委托模型加载类的过程 · 为什么要用双亲委托模型
  • markzy
  • markzy
  • 2016-11-16 23:12
  • 794

双亲委派模型

说道双亲委派模型,就要从类加载器说起。。。。。。。。。。。 Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程。 在加载阶段,java虚拟机需要完成以下3件事: a.通过...
  • p10010
  • p10010
  • 2016-01-02 15:34
  • 12796

Java类加载双亲委托模式优点

启动类加载器可以抢在标准扩展类加载之前去装载类,而标准扩展类装载器可以抢在类路径加载期之前去装在那个类,类路径装载器又可以抢在自定义类装载器之前去加载类。所以Java虚拟机先从最可信的Java核心API查找类型,这是为了防止不可信的类扮演被信任的类。 假设网络中有一个名为java.lang.Int...
  • sj940611
  • sj940611
  • 2016-09-22 16:56
  • 907

深入理解java虚拟机---双亲委派模型

双亲委派模型是java类加载器所使用的模型.s
  • a707854407
  • a707854407
  • 2014-11-01 19:54
  • 2603

jvm类加载-全盘负责和双亲委派机制

“全盘负责”是指当一个ClassLoader装载一个类时,除非显示地使用另一个ClassLoader,则该类所依赖及引用的类也由这个CladdLoader载入。 例如,系统类加载器AppClassLoader加载入口类(含有main方法的类)时,会把main方法所依赖的类及引用的类也载入,依此类推...
  • liuxiaoxiaosmile
  • liuxiaoxiaosmile
  • 2015-07-14 10:32
  • 983

Java程序员从笨鸟到菜鸟之(九十七)深入java虚拟机(六)——类加载的父亲委托机制

在前面两篇博客中我们简单介绍了类加载器的基础和类的生命周期的基础内容,今天我们来继续深入的来看一下java的类加载器的详细内容。我们都知道。类加载器用来把类加载到java虚拟机。从JDK2.0开始,类的加载过程采用父亲委托机制。JVM的ClassLoader采用的是树形结构,除了根类加载器以外,每个...
  • csh624366188
  • csh624366188
  • 2012-10-16 12:11
  • 11292

深入理解Java虚拟机笔记---双亲委派模型

站在虚拟机的角度上,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分;另外一种就是其它所有的类加载器,这些类加载器都由Java语言实现,独立于虚拟机外部,并且全部继承自java.lang.ClassLoa...
  • xtayfjpk
  • xtayfjpk
  • 2014-12-14 12:38
  • 5417

JVM类加载机制详解(二)类加载器与双亲委派模型

在上一篇JVM类加载机制详解(一)JVM类加载过程中说到,类加载机制的第一个阶段加载做的工作有: 1、通过一个类的全限定名(包名与类名)来获取定义此类的二进制字节流(Class文件)。而获取的方式,可以通过jar包、war包、网络中获取、JSP文件生成等方式。 2、将这个字节流所代表的静态存储...
  • zhangliangzi
  • zhangliangzi
  • 2016-05-07 21:19
  • 7538
    个人资料
    • 访问:1315413次
    • 积分:12313
    • 等级:
    • 排名:第1402名
    • 原创:293篇
    • 转载:144篇
    • 译文:1篇
    • 评论:113条
    最新评论