目录 一、前言 二、双亲委派 2.1、为什么需要双亲委派 2.2、双亲委派的实现 三、破坏双亲委派 3.1、为什么需要破坏双亲委派?...前段时间,笔者同事提出了一个关于类加载器破坏双亲委派的问题,以我们常见到的数据库驱动Driver为例,为什么要实现破坏双亲委派,下面一起来重温一下。...3.1、为什么需要破坏双亲委派?...,这里仅仅是举了破坏双亲委派的其中一个情况。...3.2、破坏双亲委派的实现 我们结合Driver来看一下在spi(Service Provider Inteface)中如何实现破坏双亲委派。
前段时间,笔者同事提出了一个关于类加载器破坏双亲委派的问题,以我们常见到的数据库驱动Driver为例,为什么要实现破坏双亲委派,下面一起来重温一下。...二、双亲委派 想要知道为什么要破坏双亲委派,就要先从什么是双亲委派说起,在此之前,我们先要了解一些概念: 对于任意一个类,都需要由加载它的类加载器和这个类本身来一同确立其在Java虚拟机中的唯一性。...3.1、为什么需要破坏双亲委派?...,这里仅仅是举了破坏双亲委派的其中一个情况。...3.2、破坏双亲委派的实现 我们结合Driver来看一下在spi(Service Provider Inteface)中如何实现破坏双亲委派。
双亲委派模型示意图 ? 双亲委派模型的优点 避免重复加载 父类已经加载了,子类就不需要再次加载。 eg,object 类。...双亲委派模型的实现 protected Class<?...自定义类加载器 实现方式 遵守双亲委派模型 继承ClassLoader,重写findClass()方法。 破坏双亲委派模型 继承ClassLoader,重写loadClass()方法。...SecurityManager: " + var2); } System.setSecurityManager(var3); } } 破坏双亲委派模型...热替换 比如OSGI的模块化热部署,它的类加载器就不再是严格按照双亲委派模型,很多 可能就在平级的类加载器中执行了。
双亲委派机制是Java类加载器的一种基础架构,它的作用是保证Java中类的安全性和稳定性。...双亲委派机制的优点是保证了类的唯一性,避免了重复加载。...接下来我们将介绍如何破坏双亲委派机制。在默认情况下,系统自动采用双亲委派机制,如果我们想打破这个机制,只需要自己定义一个类加载器,并且在该类加载器中覆盖loadClass()方法即可。...那么为什么要破坏双亲委派机制呢?...此时,我们就需要破坏双亲委派机制,自定义类加载器来实现这个功能
双亲委派模型(Parents Delegation Model) 类加载器 启动类加载器 拓展类加载器 应用程序类加载器 注意: 不是用继承,而是用组合去实现 参考 详谈双亲委派机制
继续再次加载Application ClassLoader 应用类加载器,即系统即在此,加载当前应用下的类 最后再次加载ClassLoader类 双亲委派模型 该模型是先检查指定名称的类是否已经加载过,
使用双亲委派模型来组织类加载器的一个好处就是 Java类因类加载器具备了一种带有优先级的层次关系。...String name) throws ClassNotFoundException { throw new ClassNotFoundException(name); } } 破坏双拼委派模型...双亲委派模型并不是一个强制性的约束模型,而是 Java设计者推荐给开发者的类加载器实现方式。...,已经违背了双亲委派模型,但这也是无可奈何的事情。...双亲委派模型的第三次“被破坏”是由于用户对程序的动态性的追求导致的,例如 OSGi的出现。在 OSGi环境下,类加载器不再是双亲委派模型中的树状结构,而是进一步发展为网状结构。
我们都知道类加载的双亲委派模型 ?...双亲委派模型并不是一个强制约束模型,而是java设计者推荐给开发者的类加载实现方式;但是也会有例外; 今天我们主要来讲一讲 类似于SPI这种设计导致的双亲委派模型被“破坏”的情况; JDBC 不破坏双亲委派模型的情况...这个时候,我们通过DriverManager去获取connection的时候只要遍历当前所有Driver实现,然后选择一个建立连接就可以了 破坏双亲委派模型的情况 在JDBC4.0以后,开始支持使用spi...这就是双亲委派模型的局限性了,父级加载器无法加载子级类加载器路径中的类。...Thread.currentThread().getContextClassLoader(); 这个值如果没有特定设置,一般默认使用的是应用程序类加载器; 总结 为了实现SPI这种模式,实现可插拔 做出了不符合双亲委派原则行为
2.2 双亲委派模型过程 某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载...使用双亲委派模型的好处在于Java类随着它的类加载器一起具备了一种带有优先级的层次关系 例如类java.lang.Object,它存在于rt.jar中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的...相反,如果没有双亲委派模型而是由各个类加载器自行加载的话,如果用户编写了一个java.lang.Object的同名类并放在ClassPath中,那系统中将会出现多个不同的Object类,程序将混乱。...(resolve) { resolveClass(c); } return c; } } 注意,双亲委派模型是...大多数的类加载器都遵循这个模型,但是JDK中也有较大规模破坏双亲模型的情况,例如线程上下文类加载器(Thread Context ClassLoader)的出现,具体分析可以参见周志明著《深入理解Java
双亲委派模型 模型如下图: 双亲委派模型中除了启动类加载器之外其余都需要有自己的父类加载器 当一个类收到了类加载请求时: 自己不会首先加载,而是委派给父加载器进行加载,每个层次的加载器都是这样。...双亲委派的好处 : 由于每个类加载都会经过最顶层的启动类加载器,比如 java.lang.Object这样的类在各个类加载器下都是同一个类(只有当两个类是由同一个类加载器加载的才有意义,这两个类才相等。...如果没有双亲委派模型,由各个类加载器自行加载的话。
在java虚拟机中,各种类加载器配合使用的模型就是双亲委派模型。 双亲委派模型 ?...双亲委派模型的工作流程全部在ClassLoader的loadClass()方法中执行: @Override protected Class<?...} if(resolve){ resolveClass(c); } return c; } 若一个类加载器收到了类加载请求: 步骤: 把该类加载请求委派给父加载器父完成
什么是双亲委派模型?...理解双亲委派模型 感觉这个字面意思好难理解, 个人理解:有一件事我不敢让父亲去干,但是我父亲默认也不干,于是让父亲的父亲去干,父亲的父亲也不干(也就是你爷爷),你爷爷也不干,让你爷爷的父亲去干于是你爷爷的父亲也没办法推辞的上面没人了...1)如上图,其中每个类加载气都有自己对应加载的目标,比如说我们的Object,它是存放在rt.jar之中的,无论哪个类加载器要加载这一个类,最终都会委派到最顶端的启动类加载器,因此Object类在程序的各种类加载器环境中都是同一个类...这也就体现了双亲委派要解决的问题之一,就是防止重复加载导致冲突。导致程序一片混乱。...类加载的双亲委派模型并不是强制的,用户可以根据需要在某个时间点动态加载类; (3)扩展类加载源,例如从数据库、网络进行类加载; (4)
1、小故事理解类加载器以及双亲委派模型 首先我们来描述一个小说场景,通过这个场景在去理解我们相关的类加载器的执行以及双亲委派模型。 上古时代有逍遥派和万魔宗两个宗派,互相对立。...重写findClass()方法 4.3 调用defineClass()方法 ---- 双亲委派模型 1、什么是双亲委派模型?...2、双亲委派模型是如何使用的? 1)我们在自定义加载器中查找是否有需要加载的文件,如果已经加载过,直接返回字节码。...ExtClassLoader到自己指定的 类加载路径下(java.ext.dirs)查看 6) 最后到自定义类加载器指定的路径还没有找到对应XXX.class字节码,则抛出异常ClassNotFoundException 双亲委派有什么好处呢...里面写这么一句代码 System.exit(0); 初始化这个Integer的构造器是会退出JVM,破坏应用程序的正常进行,如果使用双亲委派机制的话该Integer类永远不会被调用,以为委托BootStrapClassLoader
双亲委派机制 在加载类的时候,会一级一级向上委托,判断是否已经加载,从自定义类加载器-》应用类加载器-》扩展类加载器-》启动类加载器,如果到最后都没有加载这个类,则回去加载自己的类。...双亲委托有个弊端: 不能向下委派,不能不委派 怎么打破双亲委派机制:(也就是能向下委派和不委派) 自定义类加载器(不委派) spi机制(向下委派) 打破双亲委派 打破双亲委派的两种方式: 1.通过spi...由于双亲委派模型,父加载器是拿不到通过子加载器加载的类的。这个时候就需要启动类加载器来委托子类来加载Driver实现,从而破坏了双亲委派。...自定义类加载器 实现逻辑:自定义类继承classLoader,作为自定义类加载器,重写loadClass方法,不让它执行双亲委派逻辑,从而打破双亲委派。...,从而打破双亲委派 if (name.startsWith("com.chuan")){ c=findClass(
双亲委派模型是 Java 类加载器的一种工作模式,通过这种工作模式,Java 虚拟机将类文件加载到内存中,这样就保证了 Java 程序能够正常的运行起来。那么双亲委派模型究竟说的是啥呢?...加载流程如下图所示: 一般“双亲”指的是“父亲”和“母亲”,而在这里“双亲”指的是类加载类先向上找,再向下找的流程就叫做双亲委派模型。...3.优缺点分析 3.1 优点 双亲委派模型的优点有两个: 1、安全。 2、避免重复加载。...3.1.2 避免重复加载 使用双亲委派模型也可以避免一个类被重复加载,当一个类被加载之后,因为使用的双亲委派模型,这样不会出现多个类加载器都将同一个类重复加载的情况了。...总结 双亲委派模型是和 Java 中多个类加载器(启动类加载器、扩展加载器、应用程序类加载器)的运行规则,通过这个(双亲委派模型)规则可以避免类的非安全问题和类被重复加载的问题,但它也遇到了一些问题,比如
双亲委派 ClassLoader 传递性 使用调用者 Class 对象的ClassLoader加载。
类加载器双亲委派模型图 双亲委派模型构成 启动类加载器 扩展类加载器 应用程序类加载器 自定义类加载器 双亲委派模型工作过程是 如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成...为什么需要双亲委派模型?...如果没有双亲委派,那么用户是不是可以自己定义一个java.lang.Object的同名类、java.lang.String的同名类,等等,并把它放到ClassPath中,那么类之间的比较结果及类的唯一性将无法保证...因此,双亲委派模型可以防止内存中出现多份同样的字节码。
为什么要搞双亲委派?...—— 主要是为了安全问题双亲委派模型源码,java.lang.ClassLoader 的核心方法 loadClass() 的实现:public abstract class ClassLoader {...> findLoadedClass0(String name); // 本地类}1.1、魔术.note委派机制的流程图:
最初看到这个“双亲委派”四个字的时候,我是接受的。当时也没什么多余想法,看到名词就感觉这大概就是最权威的。 但,最近我开始怀疑这样的翻译了。...双亲委派?你委派给谁?双亲?双亲又是什么?...(摘自《深入理解Java虚拟机》) 通过这个图,我们也无法想象为什么叫 双亲 。明明都只有一个parent。要叫也叫单亲啊。 “双亲委派”这个词估计也不是咱自己生造的,肯定也是从洋文中翻译来的。...这个显然无法翻译成“双亲”啊,即使翻译也应该是 “父委托模型” 或 “父委派模型”。...这个真的无法叫双亲啊,make no sense啊。还不如叫“啃老模型”,如果要正式一点,那建议是:“父委托模型”或“父委派模型”。
一般提问 JVM 知识点的时候,就会顺带问你双亲委派模型(别扭的翻译。。。)。 就算是不准备面试,学习双亲委派模型对于我们也非常有帮助。...我们比较熟悉的 Tomcat 服务器为了实现 Web 应用的隔离,就自定义了类加载并打破了双亲委派模型。 这篇文章我会先介绍类加载器,再介绍双亲委派模型,这样有助于我们更好地理解。...但是,如果想打破双亲委派模型则需要重写 loadClass() 方法。 双亲委派模型 双亲委派模型介绍 类加载器有很多种,当我们想要加载一个类的时候,具体是哪个类加载器加载呢?...这就需要提到双亲委派模型了。...但是,如果想打破双亲委派模型则需要重写 loadClass() 方法。 为什么是重写 loadClass() 方法打破双亲委派模型呢?
领取专属 10元无门槛券
手把手带您无忧上云