美文网首页
双亲委派模型

双亲委派模型

作者: 吐泡泡的喵_33ea | 来源:发表于2019-04-28 10:39 被阅读0次

一、定义

双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器,这里的父子关系一般不会以继承的关系实现,而是使用组合关系来复用父加载器的代码。

优点:1. Java类随着类加载器一起具备了带有优先级的层次关系。

2. 避免类的重复加载

二、实现

如果一个类加载器收到了一个类加载的请求,首先检查是否已经被加载过,如果没有则调用父加载器的loadClass()方法,若父加载器为空,则默认使用启动类加载器作为父加载器。如果父类加载失败,则抛出ClassNotFoundException异常后,再调用自己的findClass()方法进行加载。

三、破坏双亲委派模型

双亲委派模型并不是一个强制性的约束模型,而是Java设计者推荐给开发者的实现方式。

双亲委派模型主要出现过3次“被破坏”情况。

1. 第一次被破坏发生在双亲委派模型出现之前,即JDK1.2发布之前。因为类加载器和抽象类java.lang.classLoader在JDK1.0时已经存在,设计者为了向前兼容,在JDK1.2之后的java.lang.ClassLoader添加了一个新的protected方法的findClass()方法,该方法中实现的是自己的类加载逻辑,而loadClass()方法中实现的是双亲委派模型的具体逻辑。在loadClass()方法的逻辑里如果父类加载器加载失败,则调用自己的findClass()方法来完成加载。

2. 第二次被破坏是由于模型自身缺陷导致的。在双亲委派模型中,越基础的类由越上层的类加载器进行加载,但如果基础类又要调回用户的代码呢?比如JNDI服务,它的代码由启动类加载器加载,但JNDI是对资源进行集中管理和查找,它需要调用由独立厂商实现并部署在应用程序的ClassPath下的JNDI接口提供者的代码,但启动类加载器不可能认识这些代码。为此,Java设计者们引入了一个线程上下文类加载器。JNDI可以使用它加载所需要的SPI代码。类似还有JDBC、JCE等。

3. 第三次破坏是由于用户对程序动态性的追求导致的。比如OSGI,它实现模块化热部署的关键则是它自定义的类加载器机制的实现,每一个程序模块都有一个自己的类加载器,当需要更换一个模块时,就把模块连同类加载器一起换掉以实现代码的热替换。在OSGi环境下,类加载器不再是双亲委派模型中的树状结构,而是进一步发展为更加复杂的网状结构。

相关文章

  • Tomcat类载入器

    大家都知道,Java的类加载机制是双亲委派模型,那么什么是双亲委派模型呢?我们这里简要的说一下,双亲委派模型...

  • java类加载破坏双亲委派模型

    前面java类加载器与双亲委派模型中提到Java采用个双亲委派的方式来完成类加载,但是双亲委派模型并不是一个强制的...

  • Java 类加载

    双亲委派模型 并非强制 而是推荐 SPI 父类加载器需要子类加载器加载类 打破双亲委派模型 https://www...

  • sandBox源码分析之ClassLoader

    提起classLoader,就不由自主想起了java classLoader的双亲委派模型,那么到底什么是双亲委派...

  • 双亲委派模型

    一、类加载器简介:JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构: Bootstrap ClassL...

  • 双亲委派模型

    一、为什么要用这种模型 保证相同的字节码文件不被重复加载 二、利用双亲委派模型加载类的过程 java.lang.C...

  • 双亲委派模型

    jdk1.2后 虚拟机 的类加载器 使用的就是双亲委派模型; 主要有三种加载器: 1:Bootstrap clas...

  • 双亲委派模型

    类与类加载器 类加载器非常重要,因为每个类加载器都有一个独立的类名称空间。比如我们要加载两个类,如果要比较两个类是...

  • 双亲委派模型

    为何需要双亲委派模型: 如果你自己重写一个String类, 会发生什么?两个字:安全 JVM运行流程, JVM基本...

  • 双亲委派模型

    首先说一说什么是类和类加载器 1.类(Class) 我们在编写代码时,创建的每个“*.java”文件都可以认为是一...

网友评论

      本文标题:双亲委派模型

      本文链接:https://www.haomeiwen.com/subject/xngrnqtx.html