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

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

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

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

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

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

    1.5K20

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

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

    2.5K20

    吐槽“双亲委派”

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

    2K100

    Java中的双亲委派机制

    这种灵活性使得Java能够适应不同的应用场景和需求。 这时候,我们就提到了委派机制,那我们就得来看看这个双亲委派机制是什么了?...双亲委派机制 双亲委派机制(Parent Delegation Mechanism)是Java中类加载器(ClassLoader)的一种工作机制,旨在保证类的加载是有序的,避免重复加载同一个类,并确保类的安全性和一致性...总的来说,双亲委派机制是Java类加载器的重要工作机制之一,它确保了类的有序加载、提高了加载效率和安全性,并简化了类加载器的实现。同时,它也为Java应用程序提供了更灵活和安全的类加载机制。...所以双亲委派机制在 JVM 中是十分重要的,如果没有双亲委派机制则会出现下面的这几种情况了: 1.安全性降低 Java的核心类库会被随意替换或篡改 2.类加载冲突 不同的类加载器可能会加载同一个类的不同版本...,这会导致类加载冲突 3.类的加载顺序将变得不可预测 4.破坏JVM的模块化 所以,你对双亲委派机制了解了么?

    14210

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

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

    36510

    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为什么要破坏双亲委派模型?

    36230

    双亲委派模型

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

    39810

    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 中找到。因此即使不在同一个目录下,也能正常的去用它。

    78620

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

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

    40130

    【JVM】双亲委派模型

    双亲委派模型(面试高频) 之所以这个东西面试出场概率高高,最大的原因就是它起的名字很好听 描述了查找 .class 文件的策略。...JVM 中的类加载器默认是由三个(也可以自定义个数) 类加载器的作用,给它一个“权限定类名”(带有包的类名(java. lang. String)),给了之后,就找到对应的 .class 文件。...这里的类加载器就是从不同的目录中进行查找 BootstrapClassLoader 负责查找标准库的目录 ExtensionClassLoader 负责查找扩展库的目录 Java 语法的规范里面描述了标准库中应该有哪些功能...有一个指针(引用)parent,指向自己的“父”类加载器 双亲委派模型,就描述了上述类加载器之间是符合配合工作的 工作过程 双亲委派模型工作过程: 从 ApplicationClassLoader 作为入口...此时说明类加载过程失败了,就会抛出 ClassNotFoundException 异常 存在意义 上述设定的最主要的目的就是为了确保这几个类加载器之间的优先级 按照上述的顺序,假定在代码中自己定义了一个 java.lang.String

    9510

    1.4 打破双亲委派机制

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

    1.2K10
    领券