首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【JVM】浅谈双亲委派和破坏双亲委派

目录 一、前言 二、双亲委派 2.1、为什么需要双亲委派 2.2、双亲委派的实现 三、破坏双亲委派 3.1、为什么需要破坏双亲委派?...3.2、破坏双亲委派的实现 四、总结 一、前言 笔者曾经阅读过周志明的《深入理解Java虚拟机》这本书,阅读完后自以为对jvm有了一定的了解,然而当真正碰到问题的时候,才发现自己读的有多粗糙,也体会到只有实践才能加深理解...前段时间,笔者同事提出了一个关于类加载器破坏双亲委派的问题,以我们常见到的数据库驱动Driver为例,为什么要实现破坏双亲委派,下面一起来重温一下。...二、双亲委派 想要知道为什么要破坏双亲委派,就要先从什么双亲委派说起,在此之前,我们先要了解一些概念: 对于任意一个类,都需要由加载它的类加载器和这个类本身来一同确立其在Java虚拟机中的唯一性。...3.1、为什么需要破坏双亲委派

34030
您找到你想要的搜索结果了吗?
是的
没有找到

【JVM】浅谈双亲委派和破坏双亲委派

前段时间,笔者同事提出了一个关于类加载器破坏双亲委派的问题,以我们常见到的数据库驱动Driver为例,为什么要实现破坏双亲委派,下面一起来重温一下。...二、双亲委派 想要知道为什么要破坏双亲委派,就要先从什么双亲委派说起,在此之前,我们先要了解一些概念: 对于任意一个类,都需要由加载它的类加载器和这个类本身来一同确立其在Java虚拟机中的唯一性。...2.1、为什么需要双亲委派 基于上述的问题:如果不是同一个类加载器加载,即时是相同的class文件,也会出现判断不想同的情况,从而引发一些意想不到的情况,为了保证相同的class文件,在使用的时候,是相同的对象...3.1、为什么需要破坏双亲委派?...3.2、破坏双亲委派的实现 我们结合Driver来看一下在spi(Service Provider Inteface)中如何实现破坏双亲委派

1.4K20

双亲委派机制及打破双亲委派示例

双亲委派机制 在加载类的时候,会一级一级向上委托,判断是否已经加载,从自定义类加载器-》应用类加载器-》扩展类加载器-》启动类加载器,如果到最后都没有加载这个类,则回去加载自己的类。...双亲委托有个弊端: 不能向下委派,不能不委派 怎么打破双亲委派机制:(也就是能向下委派和不委派) 自定义类加载器(不委派) spi机制(向下委派) 打破双亲委派 打破双亲委派的两种方式: 1.通过spi...为什么通过spi机制就能打破双亲委托? 因为在某些情况下父类加载器需要委托子类加载器去加载class文件。受到加载范围的限制,父类加载器无法加载到需要的文件。...由于双亲委派模型,父加载器是拿不到通过子加载器加载的类的。这个时候就需要启动类加载器来委托子类来加载Driver实现,从而破坏了双亲委派。...自定义类加载器 实现逻辑:自定义类继承classLoader,作为自定义类加载器,重写loadClass方法,不让它执行双亲委派逻辑,从而打破双亲委派

2K20

双亲委派模型

使用双亲委派模型来组织类加载器的一个好处就是 Java类因类加载器具备了一种带有优先级的层次关系。...双亲委派模型对于保证 Java程序的稳定运作很重要,但它的实现非常简单,实现双亲委派代码都集中在 java.lang.ClassLoader 的 loadClass() 方法中,如下,逻辑简单清晰,先检查是否已经被加载过...双亲委派模型并不是一个强制性的约束模型,而是 Java设计者推荐给开发者的类加载器实现方式。...,已经违背了双亲委派模型,但这也是无可奈何的事情。...双亲委派模型的第三次“被破坏”是由于用户对程序的动态性的追求导致的,例如 OSGi的出现。在 OSGi环境下,类加载器不再是双亲委派模型中的树状结构,而是进一步发展为网状结构。

37610

吐槽“双亲委派

(此图为网上下载) 真的不想说什么。最初看到这个“双亲委派”四个字的时候,我是接受的。当时也没什么多余想法,看到名词就感觉这大概就是最权威的。 但,最近我开始怀疑这样的翻译了。...因为它真的不能够准确的让人把它映射到Java类加载机制的画面上去。 双亲委派?你委派给谁?双亲双亲又是什么?...看看Java类加载的委派模型图: 基本机制就是: 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中...(摘自《深入理解Java虚拟机》) 通过这个图,我们也无法想象为什么双亲 。明明都只有一个parent。要叫也叫单亲啊。 “双亲委派”这个词估计也不是咱自己生造的,肯定也是从洋文中翻译来的。...这个显然无法翻译成“双亲”啊,即使翻译也应该是 “父委托模型” 或 “父委派模型”。

2K100

面试官:什么双亲委派模型?

双亲委派模型是 Java 类加载器的一种工作模式,通过这种工作模式,Java 虚拟机将类文件加载到内存中,这样就保证了 Java 程序能够正常的运行起来。那么双亲委派模型究竟说的是啥呢?...1.类加载器 双亲委派模型针对的是 Java 虚拟机中三个类加载器的,这三个类加载器分别是: 启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader...3.1.2 避免重复加载 使用双亲委派模型也可以避免一个类被重复加载,当一个类被加载之后,因为使用的双亲委派模型,这样不会出现多个类加载器都将同一个类重复加载的情况了。...3.2 缺点 双亲委派模型的典型问题是加载 SPI 实现类的场景,比如 JNDI(Java Naming and Directory Interface,Java 命名与目录接口)服务,它的代码由启动类加载器去加载...总结 双亲委派模型是和 Java 中多个类加载器(启动类加载器、扩展加载器、应用程序类加载器)的运行规则,通过这个(双亲委派模型)规则可以避免类的非安全问题和类被重复加载的问题,但它也遇到了一些问题,比如

28610

ClassLoader和双亲委派

ClassLoader的层级结构 熟悉Java的朋友应该知道,对于A类来说,如果是默认情况下,它的ClassLoader应该是AppClassLoader, 我们可以通过 A.class.getClassLoader...33909752 sun.misc.Launcher.AppClassLoader@6d06d69c sun.misc.Launcher.ExtClassLoader@70dea4e 另一个有意思的问题 还记得双亲委派吗...,Java在寻找类的时候会从根ClassLoader去加载的逻辑?...好了,先记住双亲委派,然后来思考下面这种场景。 我们可以直接在B类里 new 一个 A类对象吗?可以的话,为什么可以? 其实这是一个考察Java基础知识的问题,可以用下面的方法来验证它。...为什么呢,这就是双亲委派。 B在构造A的时候,它会先从根ClassLoader里去找,从上往下,直到在 AppClassLoader 中找到。因此即使不在同一个目录下,也能正常的去用它。

75420

JAVA ClassLoader双亲委派机制细节研究

我们还知道,JAVA虚拟机的ClassLoader采用“双亲委派”机制,如下图所示: 图中BootstrapClassLoader、ExtClassLoader 和 AppClassLoader是JVM...所谓“双亲委派”就是指当前类加载器在决定加载一个类之前,不是直接自己加载,而是先委派其父类来加载,如果其父类能加载该类,则直接返回父类加载的类,否则才会自行加载。...如果两个加载器之间没有直接或间接的父子关系,那么它们各自加载的类相互不可见 最后,需要强调的是,双亲委派模型也并非是完美无缺,一些特殊的场景下,是没有遵守双亲委派机制的,详见参考博客9~11。...://www.cnblogs.com/lanxuezaipiao/p/4138511.html 关于java类加载双亲委派机制的思考 6、https://blog.csdn.net/weixin_43258908...10、JDBC、Tomcat为什么要破坏双亲委派模型?

30830

面试官:什么双亲委派模型?

一般提问 JVM 知识点的时候,就会顺带问你双亲委派模型(别扭的翻译。。。)。 就算是不准备面试,学习双亲委派模型对于我们也非常有帮助。...但是,如果想打破双亲委派模型则需要重写 loadClass() 方法。 双亲委派模型 双亲委派模型介绍 类加载器有很多种,当我们想要加载一个类的时候,具体是哪个类加载器加载呢?...双亲委派模型的执行流程 双亲委派模型的实现代码非常简单,逻辑非常清晰,都集中在 java.lang.ClassLoader 的 loadClass() 中,相关代码如下所示。...双亲委派模型的好处 双亲委派模型保证了 Java 程序的稳定运行,可以避免类的重复加载(JVM 区分不同类的方式不仅仅根据类名,相同的类文件被不同的类加载器加载产生的是两个不同的类),也保证了 Java...但是,如果想打破双亲委派模型则需要重写 loadClass() 方法。 为什么是重写 loadClass() 方法打破双亲委派模型呢?

33530

Java编程进阶之路 04】深入探索:Java类加载器与双亲委派 & 打破双亲委派桎梏

下面我们将详细探讨双亲委派机制的工作原理、优势、以及它在Java生态系统中的应用。...01 双亲委派模型的基本概念 双亲委派模型是Java类加载机制中的核心概念,它的基本概念可以分为以下几点进行分点描述: 层次结构:双亲委派模型要求除了顶层的启动类加载器(Bootstrap ClassLoader...04 双亲委派模型在Java生态系统中的应用 在Java生态系统中,双亲委派模型被广泛应用在各种类型的类加载器中。...05 如何打破双亲委派模型 在Java中,打破双亲委派模型通常是为了满足一些特殊的需求,比如实现热部署、插件化、或者加载一些非核心类库的代码。...06 小结 双亲委派模型是Java类加载机制中的一个重要概念,它保证了Java应用的安全和稳定。

12610

JVM双亲委派机制

1.双亲委派机制原理 Java虚拟机对 class 文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的 class 文件加载到内存中生成 class 对象。...而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行...如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器; 如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式...父类加载器一层一层往下分配任务,如果子类加载器能加载,则加载此类,如果将加载任务分配至系统类加载器也无法加载此类,则抛出异常 图片 2.双亲委派机制代码示例 举例一: 我们自己定义一个java.lang...3.双亲委派机制的优势 避免类的重复加载 保护程序安全,防止核心API被随意篡改 自定义类:java.lang.String 没有调用 自定义类:java.lang.ShkStart(报错:阻止创建

29830

1.4 打破双亲委派机制

什么是打破双亲委派机制呢? 那么这里第一步, 我们需要知道什么双亲委派机制? 前面已经说了什么双亲委派机制了, 那打破是怎么回事呢?...根据双亲委派机制, 我们知道, 他一定是被应用程序类加载器AppClassLoader加载, 而不是我们自定义的类加载器, 为什么呢? 因为他要向上寻找, 向下委托....我们要打破双亲委派机制, 就是要让自定义类加载器来加载我们的User1.class, 而不是应用程序类加载器来加载 接下来分析, 如何打破双亲委派机制呢? 双亲委派机制是在哪里实现的?...里面实现了双亲委派机制 下面给DefinedClassLoaderTest.java增加一个loadClass方法, 拷贝上面的代码即可....删除掉中间实现双亲委派机制的部分 这里需要注意的是, com.lxl.jvm是自定义的类包, 只有我们自己定义的类才从这里加载. 如果是系统类, 依然使用双亲委派机制来加载.

1.2K10
领券