目录 一、前言 二、双亲委派 2.1、为什么需要双亲委派 2.2、双亲委派的实现 三、破坏双亲委派 3.1、为什么需要破坏双亲委派?...3.2、破坏双亲委派的实现 四、总结 一、前言 笔者曾经阅读过周志明的《深入理解Java虚拟机》这本书,阅读完后自以为对jvm有了一定的了解,然而当真正碰到问题的时候,才发现自己读的有多粗糙,也体会到只有实践才能加深理解...前段时间,笔者同事提出了一个关于类加载器破坏双亲委派的问题,以我们常见到的数据库驱动Driver为例,为什么要实现破坏双亲委派,下面一起来重温一下。...二、双亲委派 想要知道为什么要破坏双亲委派,就要先从什么是双亲委派说起,在此之前,我们先要了解一些概念: 对于任意一个类,都需要由加载它的类加载器和这个类本身来一同确立其在Java虚拟机中的唯一性。...3.1、为什么需要破坏双亲委派?
双亲委派机制是Java类加载器的一种基础架构,它的作用是保证Java中类的安全性和稳定性。...双亲委派机制的优点是保证了类的唯一性,避免了重复加载。...接下来我们将介绍如何破坏双亲委派机制。在默认情况下,系统自动采用双亲委派机制,如果我们想打破这个机制,只需要自己定义一个类加载器,并且在该类加载器中覆盖loadClass()方法即可。...那么为什么要破坏双亲委派机制呢?...此时,我们就需要破坏双亲委派机制,自定义类加载器来实现这个功能
前段时间,笔者同事提出了一个关于类加载器破坏双亲委派的问题,以我们常见到的数据库驱动Driver为例,为什么要实现破坏双亲委派,下面一起来重温一下。...二、双亲委派 想要知道为什么要破坏双亲委派,就要先从什么是双亲委派说起,在此之前,我们先要了解一些概念: 对于任意一个类,都需要由加载它的类加载器和这个类本身来一同确立其在Java虚拟机中的唯一性。...2.1、为什么需要双亲委派 基于上述的问题:如果不是同一个类加载器加载,即时是相同的class文件,也会出现判断不想同的情况,从而引发一些意想不到的情况,为了保证相同的class文件,在使用的时候,是相同的对象...3.1、为什么需要破坏双亲委派?...3.2、破坏双亲委派的实现 我们结合Driver来看一下在spi(Service Provider Inteface)中如何实现破坏双亲委派。
双亲委派机制 在加载类的时候,会一级一级向上委托,判断是否已经加载,从自定义类加载器-》应用类加载器-》扩展类加载器-》启动类加载器,如果到最后都没有加载这个类,则回去加载自己的类。...双亲委托有个弊端: 不能向下委派,不能不委派 怎么打破双亲委派机制:(也就是能向下委派和不委派) 自定义类加载器(不委派) spi机制(向下委派) 打破双亲委派 打破双亲委派的两种方式: 1.通过spi...为什么通过spi机制就能打破双亲委托? 因为在某些情况下父类加载器需要委托子类加载器去加载class文件。受到加载范围的限制,父类加载器无法加载到需要的文件。...由于双亲委派模型,父加载器是拿不到通过子加载器加载的类的。这个时候就需要启动类加载器来委托子类来加载Driver实现,从而破坏了双亲委派。...自定义类加载器 实现逻辑:自定义类继承classLoader,作为自定义类加载器,重写loadClass方法,不让它执行双亲委派逻辑,从而打破双亲委派。
双亲委派模型(Parents Delegation Model) 类加载器 启动类加载器 拓展类加载器 应用程序类加载器 注意: 不是用继承,而是用组合去实现 参考 详谈双亲委派机制
在自定义加载器的构造方法编码时需要指定一个父类加载器,如果没有指定就将system classloader设置为父类加载器 在java运行时,一个java类的唯一性由全类名和它的类加载器共同决定;换句话说...双亲委派:某个class loader会优先委派给它的parent classloader加载类; 假设“Bar”类引用了“Foo”类,在加载Foo的时候,会把Bar的defining loader作为开始尝试...参考资料 https://stackoverflow.com/questions/2424604/what-is-a-java-classloader https://docs.oracle.com/javase.../9/docs/api/java/lang/ClassLoader.html https://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html...https://blogs.oracle.com/sundararajan/understanding-java-class-loading
这种灵活性使得Java能够适应不同的应用场景和需求。 这时候,我们就提到了委派机制,那我们就得来看看这个双亲委派机制是什么了?...双亲委派机制 双亲委派机制(Parent Delegation Mechanism)是Java中类加载器(ClassLoader)的一种工作机制,旨在保证类的加载是有序的,避免重复加载同一个类,并确保类的安全性和一致性...总的来说,双亲委派机制是Java类加载器的重要工作机制之一,它确保了类的有序加载、提高了加载效率和安全性,并简化了类加载器的实现。同时,它也为Java应用程序提供了更灵活和安全的类加载机制。...所以双亲委派机制在 JVM 中是十分重要的,如果没有双亲委派机制则会出现下面的这几种情况了: 1.安全性降低 Java的核心类库会被随意替换或篡改 2.类加载冲突 不同的类加载器可能会加载同一个类的不同版本...,这会导致类加载冲突 3.类的加载顺序将变得不可预测 4.破坏JVM的模块化 所以,你对双亲委派机制了解了么?
类加载器双亲委派模型图 双亲委派模型构成 启动类加载器 扩展类加载器 应用程序类加载器 自定义类加载器 双亲委派模型工作过程是 如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成...为什么需要双亲委派模型?...如果没有双亲委派,那么用户是不是可以自己定义一个java.lang.Object的同名类、java.lang.String的同名类,等等,并把它放到ClassPath中,那么类之间的比较结果及类的唯一性将无法保证...因此,双亲委派模型可以防止内存中出现多份同样的字节码。
继续再次加载Application ClassLoader 应用类加载器,即系统即在此,加载当前应用下的类 最后再次加载ClassLoader类 双亲委派模型 该模型是先检查指定名称的类是否已经加载过,...代码如下 import java.io.FileInputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method
双亲委派 ClassLoader 传递性 使用调用者 Class 对象的ClassLoader加载。
为什么要搞双亲委派?...—— 主要是为了安全问题双亲委派模型源码,java.lang.ClassLoader 的核心方法 loadClass() 的实现:public abstract class ClassLoader {...> findLoadedClass0(String name); // 本地类}1.1、魔术.note委派机制的流程图:
(此图为网上下载) 真的不想说什么。最初看到这个“双亲委派”四个字的时候,我是接受的。当时也没什么多余想法,看到名词就感觉这大概就是最权威的。 但,最近我开始怀疑这样的翻译了。...因为它真的不能够准确的让人把它映射到Java类加载机制的画面上去。 双亲委派?你委派给谁?双亲?双亲又是什么?...看看Java类加载的委派模型图: 基本机制就是: 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中...(摘自《深入理解Java虚拟机》) 通过这个图,我们也无法想象为什么叫 双亲 。明明都只有一个parent。要叫也叫单亲啊。 “双亲委派”这个词估计也不是咱自己生造的,肯定也是从洋文中翻译来的。...这个显然无法翻译成“双亲”啊,即使翻译也应该是 “父委托模型” 或 “父委派模型”。
使用双亲委派模型来组织类加载器的一个好处就是 Java类因类加载器具备了一种带有优先级的层次关系。...双亲委派模型对于保证 Java程序的稳定运作很重要,但它的实现非常简单,实现双亲委派代码都集中在 java.lang.ClassLoader 的 loadClass() 方法中,如下,逻辑简单清晰,先检查是否已经被加载过...双亲委派模型并不是一个强制性的约束模型,而是 Java设计者推荐给开发者的类加载器实现方式。...,已经违背了双亲委派模型,但这也是无可奈何的事情。...双亲委派模型的第三次“被破坏”是由于用户对程序的动态性的追求导致的,例如 OSGi的出现。在 OSGi环境下,类加载器不再是双亲委派模型中的树状结构,而是进一步发展为网状结构。
双亲委派模型是 Java 类加载器的一种工作模式,通过这种工作模式,Java 虚拟机将类文件加载到内存中,这样就保证了 Java 程序能够正常的运行起来。那么双亲委派模型究竟说的是啥呢?...1.类加载器 双亲委派模型针对的是 Java 虚拟机中三个类加载器的,这三个类加载器分别是: 启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader...3.1.2 避免重复加载 使用双亲委派模型也可以避免一个类被重复加载,当一个类被加载之后,因为使用的双亲委派模型,这样不会出现多个类加载器都将同一个类重复加载的情况了。...3.2 缺点 双亲委派模型的典型问题是加载 SPI 实现类的场景,比如 JNDI(Java Naming and Directory Interface,Java 命名与目录接口)服务,它的代码由启动类加载器去加载...总结 双亲委派模型是和 Java 中多个类加载器(启动类加载器、扩展加载器、应用程序类加载器)的运行规则,通过这个(双亲委派模型)规则可以避免类的非安全问题和类被重复加载的问题,但它也遇到了一些问题,比如
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 中找到。因此即使不在同一个目录下,也能正常的去用它。
我们还知道,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为什么要破坏双亲委派模型?
一般提问 JVM 知识点的时候,就会顺带问你双亲委派模型(别扭的翻译。。。)。 就算是不准备面试,学习双亲委派模型对于我们也非常有帮助。...但是,如果想打破双亲委派模型则需要重写 loadClass() 方法。 双亲委派模型 双亲委派模型介绍 类加载器有很多种,当我们想要加载一个类的时候,具体是哪个类加载器加载呢?...双亲委派模型的执行流程 双亲委派模型的实现代码非常简单,逻辑非常清晰,都集中在 java.lang.ClassLoader 的 loadClass() 中,相关代码如下所示。...双亲委派模型的好处 双亲委派模型保证了 Java 程序的稳定运行,可以避免类的重复加载(JVM 区分不同类的方式不仅仅根据类名,相同的类文件被不同的类加载器加载产生的是两个不同的类),也保证了 Java...但是,如果想打破双亲委派模型则需要重写 loadClass() 方法。 为什么是重写 loadClass() 方法打破双亲委派模型呢?
1.自定义加载器 沿用双亲委派机制自定义类加载器很简单,只需继承ClassLoader类并重写findClass方法即可。...object = clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } } } 2.打破双亲委派机制则不仅要继承...ClassLoader的TestClassLoaderN类,这个类与前面的TestClassLoader类很相似,但它除了重写findClass方法外还重写了loadClass方法,默认的loadClass方法是实现了双亲委派机制的逻辑...这里为了破坏双亲委派机制必须重写loadClass方法,即这里先尝试交由System类加载器加载,加载失败才会由自己加载。它并没有优先交给父类加载器,这就打破了双亲委派机制。
下面我们将详细探讨双亲委派机制的工作原理、优势、以及它在Java生态系统中的应用。...01 双亲委派模型的基本概念 双亲委派模型是Java类加载机制中的核心概念,它的基本概念可以分为以下几点进行分点描述: 层次结构:双亲委派模型要求除了顶层的启动类加载器(Bootstrap ClassLoader...04 双亲委派模型在Java生态系统中的应用 在Java生态系统中,双亲委派模型被广泛应用在各种类型的类加载器中。...05 如何打破双亲委派模型 在Java中,打破双亲委派模型通常是为了满足一些特殊的需求,比如实现热部署、插件化、或者加载一些非核心类库的代码。...06 小结 双亲委派模型是Java类加载机制中的一个重要概念,它保证了Java应用的安全和稳定。
什么是打破双亲委派机制呢? 那么这里第一步, 我们需要知道什么是双亲委派机制? 前面已经说了什么是双亲委派机制了, 那打破是怎么回事呢?...根据双亲委派机制, 我们知道, 他一定是被应用程序类加载器AppClassLoader加载, 而不是我们自定义的类加载器, 为什么呢? 因为他要向上寻找, 向下委托....我们要打破双亲委派机制, 就是要让自定义类加载器来加载我们的User1.class, 而不是应用程序类加载器来加载 接下来分析, 如何打破双亲委派机制呢? 双亲委派机制是在哪里实现的?...里面实现了双亲委派机制 下面给DefinedClassLoaderTest.java增加一个loadClass方法, 拷贝上面的代码即可....删除掉中间实现双亲委派机制的部分 这里需要注意的是, com.lxl.jvm是自定义的类包, 只有我们自己定义的类才从这里加载. 如果是系统类, 依然使用双亲委派机制来加载.
领取专属 10元无门槛券
手把手带您无忧上云