Java 双亲委派模型机制 分手后的思念是犯贱 2023-01-02 02:17 211阅读 0赞 #### 前言 #### Java是运行在Java的虚拟机(JVM)中的,在初步学习Java时,我们都知道,编写的Java源代码会被编译器编译成`.class`的字节码文件。然后`ClassLoader`负责将这些`class`文件给加载到JVM中去执行。 我们跑Java程序,跟JVM脱不了干系。 JVM中提供了三层的ClassLoader: * **Bootstrap classLoader**:主要负责加载核心的类库(java.lang.\*等),构造ExtClassLoader和APPClassLoader。 * **ExtClassLoader**:主要负责加载jre/lib/ext目录下的一些扩展的jar。 * **AppClassLoader**:主要负责加载应用程序的主函数类 #### 双亲委派机制 #### 通俗点讲,双亲可以浅显理解为父类,当.class文件将要被加载到JVM中时,会先交由AppClassLoader去加载,这时目前的ClassLoader不会去加载,而是一直向上,让父类去加载。 * 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。 * 每一个层次的类加载器都是如此。因此,所有的加载请求最终都应该传送到顶层的启动类加载器中。 * 只有当父加载器反馈自己无法完成这个加载请求时(搜索范围中没有找到所需的类),子加载器才会尝试自己去加载。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvZGV5YW5iYW8_size_16_color_FFFFFF_t_70_pic_center] 系统的ClassLoader只会**加载指定目录下的class文件**,如果想加载自己的class文件,那么就可以自定义一个ClassLoader。而且我们可以根据自己的需求,对class文件进行加密和解密。 需要注意的是,自定义加载器在“优先级”上,是最低的。 ![在这里插入图片描述][440ccd753a22d73f5ca7fcd1bc0f38bb.png_pic_center] #### Why 双亲委派 #### 通过双亲委派模型机制,**类随着它的类加载器一起具备了一种带有优先级的层次关系**。 双亲委派这种机制能够避免核心类被篡改。例如:如果有人想替换系统级别的类:String.java。篡改它的实现,在这种机制下这些系统的类已经被Bootstrap classLoader加载过了(为什么?因为当一个类需要加载的时候,最先去尝试加载的就是BootstrapClassLoader),**所以其他类加载器并没有机会再去加载,从一定程度上防止了危险代码的植入**。 再比如,如果没有使用双亲委派模型,由各个类加载器自行去加载的话,如果用户自己编写了一个称为java.lang.Object的类,在没有双亲委派模型的情况下,将会用自定义的类加载器加载,那系统中将会出现多个不同的Object类,Java类型体系中最基础的行为也就无法保证,应用程序也将会变得一片混乱。 并且,双亲委派这种机制能够**防止类的重复加载**。 #### 打破双亲委派模型的历史 #### **1.第一次破坏** 由于双亲委派模型是在JDK1.2之后才被引入的,而类加载器和抽象类java.lang.ClassLoader则在JDK1.0时代就已经存在,面对已经存在的用户自定义类加载器的实现代码,Java设计者引入双亲委派模型时不得不做出一些妥协。在此之前,用户去继承java.lang.ClassLoader的唯一目的就是为了重写loadClass()方法,因为虚拟机在进行类加载的时候会调用加载器的私有方法loadClassInternal(),而这个方法唯一逻辑就是去调用自己的loadClass()。 **2.第二次破坏** 双亲委派模型的第二次“被破坏”是由这个模型自身的缺陷所导致的,双亲委派很好地解决了各个类加载器的基础类的同一问题(越基础的类由越上层的加载器进行加载),基础类之所以称为“基础”,是因为它们总是作为被用户代码调用的API,但世事往往没有绝对的完美。 **如果基础类又要调用回用户的代码,那该么办?** 一个典型的例子就是JNDI服务,JNDI现在已经是Java的标准服务, 它的代码由启动类加载器去加载(在JDK1.3时放进去的rt.jar),但JNDI的目的就是对资源进行集中管理和查找,它需要调用由独立厂商实现并部署在应用程序的ClassPath下的JNDI接口提供者的代码,但启动类加载器不可能“认识”这些代码。 为了解决这个问题,Java设计团队只好引入了一个不太优雅的设计:线程上下文类加载器(Thread Context ClassLoader)。这个类加载器可以通过java.lang.Thread类的setContextClassLoader()方法进行设置,如果创建线程时还未设置,他将会从父线程中继承一个,如果在应用程序的全局范围内都没有设置过的话,那这个类加载器默认就是应用程序类加载器。 有了线程上下文加载器,JNDI服务就可以使用它去加载所需要的SPI代码,也就是父类加载器请求子类加载器去完成类加载的动作,这种行为实际上就是打通了双亲委派模型层次结构来逆向使用类加载器,实际上已经违背了双亲委派模型的一般性原则,但这也是无可奈何的事情。Java中所有涉及SPI的加载动作基本上都采用这种方式,例如JNDI、JDBC、JCE、JAXB和JBI等。 **3.第三次破坏** 双亲委派模型的第三次“被破坏”是由于用户对程序动态性的追求导致的,与**热部署相关**,这里所说的“动态性”指的是当前一些非常“热门”的名词:代码热替换、模块热部署等,简答的说就是机器不用重启,只要部署上就能用。 #### 参考 #### [通俗易懂的双亲委派机制][Link 1] [浅谈双亲委派模型][Link 2] [Java自定义类的加载器][Java] https://www.jianshu.com/p/166c5360a40b [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvZGV5YW5iYW8_size_16_color_FFFFFF_t_70_pic_center]: /images/20221120/044af0a0017e41c783666e2b4e1d1ad7.png [440ccd753a22d73f5ca7fcd1bc0f38bb.png_pic_center]: /images/20221120/3145846e1c8b4369a03cecb9d7464bc8.png [Link 1]: https://blog.csdn.net/codeyanbao/article/details/82875064 [Link 2]: https://juejin.cn/post/6844903544626085902 [Java]: https://blog.csdn.net/huazai30000/article/details/85296671
相关 Java 双亲委派模型机制 前言 Java是运行在Java的虚拟机(JVM)中的,在初步学习Java时,我们都知道,编写的Java源代码会被编译器编译成`.class`的字节码文件。然后`Class 分手后的思念是犯贱/ 2023年01月02日 02:17/ 0 赞/ 212 阅读
相关 双亲委派模型 双亲委派模型(图解) ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9 冷不防/ 2022年11月10日 10:43/ 0 赞/ 199 阅读
相关 java双亲委派模型 参考文章:[java双亲委派模型][java] [Java类加载器(ClassLoader)][Java_ClassLoader] 双亲委派模式要求除了顶层的启动类加载器 深碍√TFBOYSˉ_/ 2022年11月07日 04:23/ 0 赞/ 165 阅读
相关 双亲委派模型 一 定义与本质 类加载器用来把类加载到 Java 虚拟机中。从 JDK1.2 版本开始,类的加载过程采用双亲委派机制,这种机制能更好地保证 Java 平台的安全。 1 左手的ㄟ右手/ 2022年09月06日 14:19/ 0 赞/ 219 阅读
相关 双亲委派模型 说道双亲委派模型,就要从类加载器说起。。。。。。。。。。。 [Java][]虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验、转换解析和初始 亦凉/ 2022年07月12日 13:26/ 0 赞/ 232 阅读
相关 双亲委派模型 其实,双亲委派模型并不复杂。自定义类加载器也不难!随便从网上搜一下就能搜出一大把结果,然后`copy`一下就能用。但是,如果每次想自定义类加载器就必须搜一遍别人的文章,然后复制 落日映苍穹つ/ 2022年05月09日 16:56/ 0 赞/ 256 阅读
相关 双亲委派模型 双亲委派模型 类与类加载器 双亲委派模型 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到 野性酷女/ 2022年03月10日 14:28/ 0 赞/ 272 阅读
相关 双亲委派模型 双亲委派模型 双亲委派模型简介 双亲委派模型实现源码分析 双亲委派模型的好处 双亲委派模型简介 每一个类都有一个对应它的类加载器。系统中的类加载 不念不忘少年蓝@/ 2021年11月10日 14:28/ 0 赞/ 633 阅读
相关 双亲委派模型 双亲委派模型(Since JDK.2): ![这里写图片描述][70] 从虚拟机的角度来看,类加载器主要分为启动类加载器(Bootstrap Classloader)和 £神魔★判官ぃ/ 2021年09月26日 14:36/ 0 赞/ 603 阅读
相关 双亲委派模型 围绕这四个问题去回答一下: 1. 什么是双亲委派模型 2. 为什么会有双亲委派模型 3. 可以打破双亲委派模型? 4. 为什么要打破双亲委派模型? 一、 ╰+攻爆jí腚メ/ 2021年09月25日 11:08/ 0 赞/ 383 阅读
还没有评论,来说两句吧...