目录 一、前言 二、双亲委派 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)中如何实现破坏双亲委派。
双亲委派模型(Parents Delegation Model) 类加载器 启动类加载器 拓展类加载器 应用程序类加载器 注意: 不是用继承,而是用组合去实现 参考 详谈双亲委派机制
双亲委派机制 在加载类的时候,会一级一级向上委托,判断是否已经加载,从自定义类加载器-》应用类加载器-》扩展类加载器-》启动类加载器,如果到最后都没有加载这个类,则回去加载自己的类。...双亲委托有个弊端: 不能向下委派,不能不委派 怎么打破双亲委派机制:(也就是能向下委派和不委派) 自定义类加载器(不委派) spi机制(向下委派) 打破双亲委派 打破双亲委派的两种方式: 1.通过spi...为什么通过spi机制就能打破双亲委托? 因为在某些情况下父类加载器需要委托子类加载器去加载class文件。受到加载范围的限制,父类加载器无法加载到需要的文件。...由于双亲委派模型,父加载器是拿不到通过子加载器加载的类的。这个时候就需要启动类加载器来委托子类来加载Driver实现,从而破坏了双亲委派。...自定义类加载器 实现逻辑:自定义类继承classLoader,作为自定义类加载器,重写loadClass方法,不让它执行双亲委派逻辑,从而打破双亲委派。
在自定义加载器的构造方法编码时需要指定一个父类加载器,如果没有指定就将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
双亲委派 ClassLoader 传递性 使用调用者 Class 对象的ClassLoader加载。
继续再次加载Application ClassLoader 应用类加载器,即系统即在此,加载当前应用下的类 最后再次加载ClassLoader类 双亲委派模型 该模型是先检查指定名称的类是否已经加载过,...代码如下 import java.io.FileInputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method
类加载器双亲委派模型图 双亲委派模型构成 启动类加载器 扩展类加载器 应用程序类加载器 自定义类加载器 双亲委派模型工作过程是 如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成...为什么需要双亲委派模型?...如果没有双亲委派,那么用户是不是可以自己定义一个java.lang.Object的同名类、java.lang.String的同名类,等等,并把它放到ClassPath中,那么类之间的比较结果及类的唯一性将无法保证...因此,双亲委派模型可以防止内存中出现多份同样的字节码。
这种灵活性使得Java能够适应不同的应用场景和需求。 这时候,我们就提到了委派机制,那我们就得来看看这个双亲委派机制是什么了?...双亲委派机制 双亲委派机制(Parent Delegation Mechanism)是Java中类加载器(ClassLoader)的一种工作机制,旨在保证类的加载是有序的,避免重复加载同一个类,并确保类的安全性和一致性...总的来说,双亲委派机制是Java类加载器的重要工作机制之一,它确保了类的有序加载、提高了加载效率和安全性,并简化了类加载器的实现。同时,它也为Java应用程序提供了更灵活和安全的类加载机制。...所以双亲委派机制在 JVM 中是十分重要的,如果没有双亲委派机制则会出现下面的这几种情况了: 1.安全性降低 Java的核心类库会被随意替换或篡改 2.类加载冲突 不同的类加载器可能会加载同一个类的不同版本...,这会导致类加载冲突 3.类的加载顺序将变得不可预测 4.破坏JVM的模块化 所以,你对双亲委派机制了解了么?
为什么要搞双亲委派?...—— 主要是为了安全问题双亲委派模型源码,java.lang.ClassLoader 的核心方法 loadClass() 的实现:public abstract class ClassLoader {...> findLoadedClass0(String name); // 本地类}1.1、魔术.note委派机制的流程图:
(此图为网上下载) 真的不想说什么。最初看到这个“双亲委派”四个字的时候,我是接受的。当时也没什么多余想法,看到名词就感觉这大概就是最权威的。 但,最近我开始怀疑这样的翻译了。...因为它真的不能够准确的让人把它映射到Java类加载机制的画面上去。 双亲委派?你委派给谁?双亲?双亲又是什么?...看看Java类加载的委派模型图: 基本机制就是: 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中...(摘自《深入理解Java虚拟机》) 通过这个图,我们也无法想象为什么叫 双亲 。明明都只有一个parent。要叫也叫单亲啊。 “双亲委派”这个词估计也不是咱自己生造的,肯定也是从洋文中翻译来的。...这个显然无法翻译成“双亲”啊,即使翻译也应该是 “父委托模型” 或 “父委派模型”。
双亲委派模型是 Java 类加载器的一种工作模式,通过这种工作模式,Java 虚拟机将类文件加载到内存中,这样就保证了 Java 程序能够正常的运行起来。那么双亲委派模型究竟说的是啥呢?...1.类加载器 双亲委派模型针对的是 Java 虚拟机中三个类加载器的,这三个类加载器分别是: 启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader...3.1.2 避免重复加载 使用双亲委派模型也可以避免一个类被重复加载,当一个类被加载之后,因为使用的双亲委派模型,这样不会出现多个类加载器都将同一个类重复加载的情况了。...3.2 缺点 双亲委派模型的典型问题是加载 SPI 实现类的场景,比如 JNDI(Java Naming and Directory Interface,Java 命名与目录接口)服务,它的代码由启动类加载器去加载...总结 双亲委派模型是和 Java 中多个类加载器(启动类加载器、扩展加载器、应用程序类加载器)的运行规则,通过这个(双亲委派模型)规则可以避免类的非安全问题和类被重复加载的问题,但它也遇到了一些问题,比如
我们还知道,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为什么要破坏双亲委派模型?
1.自定义加载器 沿用双亲委派机制自定义类加载器很简单,只需继承ClassLoader类并重写findClass方法即可。...object = clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } } } 2.打破双亲委派机制则不仅要继承...ClassLoader的TestClassLoaderN类,这个类与前面的TestClassLoader类很相似,但它除了重写findClass方法外还重写了loadClass方法,默认的loadClass方法是实现了双亲委派机制的逻辑...这里为了破坏双亲委派机制必须重写loadClass方法,即这里先尝试交由System类加载器加载,加载失败才会由自己加载。它并没有优先交给父类加载器,这就打破了双亲委派机制。
使用双亲委派模型来组织类加载器的一个好处就是 Java类因类加载器具备了一种带有优先级的层次关系。...双亲委派模型对于保证 Java程序的稳定运作很重要,但它的实现非常简单,实现双亲委派代码都集中在 java.lang.ClassLoader 的 loadClass() 方法中,如下,逻辑简单清晰,先检查是否已经被加载过...双亲委派模型并不是一个强制性的约束模型,而是 Java设计者推荐给开发者的类加载器实现方式。...,已经违背了双亲委派模型,但这也是无可奈何的事情。...双亲委派模型的第三次“被破坏”是由于用户对程序的动态性的追求导致的,例如 OSGi的出现。在 OSGi环境下,类加载器不再是双亲委派模型中的树状结构,而是进一步发展为网状结构。
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 中找到。因此即使不在同一个目录下,也能正常的去用它。
一般提问 JVM 知识点的时候,就会顺带问你双亲委派模型(别扭的翻译。。。)。 就算是不准备面试,学习双亲委派模型对于我们也非常有帮助。...但是,如果想打破双亲委派模型则需要重写 loadClass() 方法。 双亲委派模型 双亲委派模型介绍 类加载器有很多种,当我们想要加载一个类的时候,具体是哪个类加载器加载呢?...双亲委派模型的执行流程 双亲委派模型的实现代码非常简单,逻辑非常清晰,都集中在 java.lang.ClassLoader 的 loadClass() 中,相关代码如下所示。...双亲委派模型的好处 双亲委派模型保证了 Java 程序的稳定运行,可以避免类的重复加载(JVM 区分不同类的方式不仅仅根据类名,相同的类文件被不同的类加载器加载产生的是两个不同的类),也保证了 Java...但是,如果想打破双亲委派模型则需要重写 loadClass() 方法。 为什么是重写 loadClass() 方法打破双亲委派模型呢?
双亲委派模型(面试高频) 之所以这个东西面试出场概率高高,最大的原因就是它起的名字很好听 描述了查找 .class 文件的策略。...JVM 中的类加载器默认是由三个(也可以自定义个数) 类加载器的作用,给它一个“权限定类名”(带有包的类名(java. lang. String)),给了之后,就找到对应的 .class 文件。...这里的类加载器就是从不同的目录中进行查找 BootstrapClassLoader 负责查找标准库的目录 ExtensionClassLoader 负责查找扩展库的目录 Java 语法的规范里面描述了标准库中应该有哪些功能...有一个指针(引用)parent,指向自己的“父”类加载器 双亲委派模型,就描述了上述类加载器之间是符合配合工作的 工作过程 双亲委派模型工作过程: 从 ApplicationClassLoader 作为入口...此时说明类加载过程失败了,就会抛出 ClassNotFoundException 异常 存在意义 上述设定的最主要的目的就是为了确保这几个类加载器之间的优先级 按照上述的顺序,假定在代码中自己定义了一个 java.lang.String
1.双亲委派机制原理 Java虚拟机对 class 文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的 class 文件加载到内存中生成 class 对象。...而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行...如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器; 如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式...父类加载器一层一层往下分配任务,如果子类加载器能加载,则加载此类,如果将加载任务分配至系统类加载器也无法加载此类,则抛出异常 图片 2.双亲委派机制代码示例 举例一: 我们自己定义一个java.lang...3.双亲委派机制的优势 避免类的重复加载 保护程序安全,防止核心API被随意篡改 自定义类:java.lang.String 没有调用 自定义类:java.lang.ShkStart(报错:阻止创建
领取专属 10元无门槛券
手把手带您无忧上云