双亲委派机制(代码片段)

luxuewu luxuewu     2022-12-01     619

关键词:

双亲委派机制

双亲委派的原理:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委托给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中。
只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需要加载的类)时,子加载器才会尝试自己去加载。这种从下往上委托,再从上向下加载的过程叫作双亲委派机制。

双亲委派的意义:Java类随着类加载器具备了一种带有优先级的层次关系。例如类java.lang.Object,它存放在rt.jar之中,无论哪一个类加载器要加载这个类,最终都是委托给处于模型最顶端的启动类加载器进行加载,因此Object类在程序的各种加载器环境中都是同一个类。

相反,如果没有使用双亲委托模型,直接由接到加载请求的类加载器去加载,如果用户自己编写了一个称为java.lang.Object的类,并放在程序的ClassPath中,那系统中将会出现多个不同的Object类,Java类型体系中最基础的行为也就无法保证,应用程序也将会变得一片混乱。有了双亲委派机制,如果自己去编写一个rt.jar类库中同名的类,它将只能被编译,永远无法被加载。

2.2.1  双亲委派机制的实现

双亲委派由顶层父类加载器ClassLoader的loadClass(String name,boolean resolve)方法实现,其内部包含如下两个操作:

a.调用findLoadedClass(String name)检查当前类是否已被加载,若已被加载则直接返回该类的class对象;

b.调用当前类加载器的父类加载器loadClass方法,若父类加载器为空则调用启动类加载器进行加载,当启动类加载器反馈自己无法完成这个加载请求时,在由上至下调用各级类加载器的findClass(String name)方法进行类加载。

protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException 
    // First, check if the class has already been loaded 首先确认这个类是否已经加载 如果已经加载直接返回
    Class c = findLoadedClass(name);
    if (c == null) 
        try 
            if (parent != null) //先让父类加载器加载
                c = parent.loadClass(name, false);
             else //如果父类加载器加载不了就用启动类加载器加载
                c = findBootstrapClassOrNull(name);
            
         catch (ClassNotFoundException e) 
            // ClassNotFoundException thrown if class not found
            // from the non-null parent class loader
        
        if (c == null) //启动类加载器也加载不了就自己加载
            // If still not found, then invoke findClass in order
            // to find the class.
            c = findClass(name);
        
    
    if (resolve) 
        resolveClass(c);
    
    return c;

注意:布尔型参数resolve表示是否在加载过程中便解析该类。

 自定义类加载器

JVM中,除了启动类加载器之外所有的类加载器都是ClassLoader的子类,开发者可以通过扩展ClassLoader,并重写protected Class<?> findClass(String name)方法实现自定义类加载器。

 

java虚拟机原理android类加载机制(双亲委派机制|bootclassloader|pathclassloader|dexclassloader)(代码片段)

文章目录一、Android类加载机制二、双亲委派机制一、Android类加载机制Android中的类加载使用了双亲委派机制,如下图所示:在Android中提供了333个类加载器,BootClassLoader,PathClassLoader,DexClassLoader;双亲委派机制,是委派层级上的上下层级... 查看详情

双亲委派机制(代码片段)

前言我们在IDE中编写的Java源代码被编译器编译成.class的字节码文件。然后由ClassLoader(类加载器)负责将这些.class文件加载到JVM中去执行。ClassLoaderBootstrapClassLoader(启动类加载器)C++实现在java里无法获取负责加载<JAVA_HOME>/lib... 查看详情

code皮皮虾带你盘点双亲委派机制原理优缺点,以及如何打破它?(代码片段)

文章目录🌊前言什么是双亲委派机制?双亲委派机制原理优点缺点打破双亲委派机制?前提知识:线程上下文类加载器双亲委派出现之前JDBC打破双亲委派机制Tomcat如何打破双亲委派机制?1.自定义类加载器2.... 查看详情

code皮皮虾带你盘点双亲委派机制原理优缺点,以及如何打破它?(代码片段)

文章目录🌊前言什么是双亲委派机制?双亲委派机制原理优点缺点打破双亲委派机制?前提知识:线程上下文类加载器双亲委派出现之前JDBC打破双亲委派机制Tomcat如何打破双亲委派机制?1.自定义类加载器2.... 查看详情

jdbc是如何打破双亲委派模式的(代码片段)

yJDBC是如何打破双亲委派模式的-掘金为什么JDBC需要打破双亲委派机制JDBC的DriverManager与SPI机制类加载的机制以及双亲委派机制的介绍可以参考JVM类加载机制在JDBC4.0之后,我们不再需要调用Class.https://juejin.cn/post/7007292903361871903... 查看详情

面试必备:什么时候要打破双亲委派机制?什么是双亲委派?(图解+秒懂+史上最全)(代码片段)

文章很长,建议收藏起来慢慢读!疯狂创客圈总目录语雀版|总目录码云版|总目录博客园版为您奉上珍贵的学习资源:免费赠送经典图书:《Java高并发核心编程(卷1)》面试必备+大厂必备+涨薪必备加尼... 查看详情

jvm类加载器:双亲委派机制沙箱安全机制(代码片段)

·双亲委派机制、沙箱安全机制是JVM中类加载器系统的相关术语·在这之前,应该先了解JVM类加载器系统的相关概念一、类加载器基础知识    见下图1,java文件首先会被编译成class文件,class文件作为Java虚拟机的可... 查看详情

jvm进阶之双亲委派机制(代码片段)

双亲委派机制1.概述2.本质3.实现4.优点5.弊端6.注意细节7.破坏示例8.热替换1.概述如果一个类加载器在接收到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父加载器去完成。依次递归ÿ... 查看详情

jvm进阶之双亲委派机制(代码片段)

双亲委派机制1.概述2.本质3.实现4.优点5.弊端6.注意细节7.破坏示例8.热替换1.概述如果一个类加载器在接收到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父加载器去完成。依次递归ÿ... 查看详情

java双亲委派机制在android的应用(代码片段)

Java的双亲委派机制三层类加载器1.启动类加载器(BootstrapClassLoader)这个类加载器负责加载存放在<JAVA_HOME>\\lib目录,或者被-Xbootclasspath参数所指定的路径中存放的,而且是Java虚拟机能够识别的(按照文件... 查看详情

呜,双亲委派模式伤心史(代码片段)

文章目录一、前言二、双亲委派模式2.1双亲委派模式的结构2.2先加载父类,再加载子类2.3不可以跨模块加载2.4小结三、JDBC的SPI机制违背双亲委派模式3.1为什么说JDBC破坏了双亲委派模式3.2JDBC是如何破坏JVM的双亲委派模式的3.3J... 查看详情

呜,双亲委派模式伤心史(代码片段)

文章目录一、前言二、双亲委派模式2.1双亲委派模式的结构2.2先加载父类,再加载子类2.3不可以跨模块加载2.4小结三、JDBC的SPI机制违背双亲委派模式3.1为什么说JDBC破坏了双亲委派模式3.2JDBC是如何破坏JVM的双亲委派模式的3.3J... 查看详情

双亲委派机制(代码片段)

双亲委派机制简单理解简单一句话:我爸是李刚,有事找我爸。简单三个字:往上捅双亲委派就是,有啥事,先问问老爹,如果老爹不行,再问问爷爷,如果爷爷也没有,再告爸爸,爸爸再告诉诉儿子,你自己看着办吧。图例:... 查看详情

学妹问我双亲委派机制到底是个什么东西?(代码片段)

1.什么是双亲委派机制?JVM类加载器是有亲子层级结构的,如下图这里类加载其实就有一个双亲委派机制,加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自... 查看详情

java技术专题深度分析加载器与双亲委派机制「入门篇」(代码片段)

加载器与双亲委派机制类加载器是怎么被创建出来的?什么是双亲委派机制?为什么要有这种机制?Class实例和类加载器究竟是在JavaHeap中,还是在方法区中?类加载器:可以实现通过一个类的全限定名称来获取... 查看详情

摸个鱼的功夫,搞懂双亲委派机制(代码片段)

...下去,才能浮上来。共勉(juan)。  说到双亲委派机制,首先你 查看详情

tomcat如何打破双亲委派机制实现隔离web应用的?(代码片段)

Tomcat通过自定义类加载器WebAppClassLoader打破双亲委派,即重写了JVM的类加载器ClassLoader的findClass方法和loadClass方法,以优先加载Web应用目录下的类。Tomcat负责加载我们的Servlet类、加载Servlet所依赖的JAR包。Tomcat本身也是个Ja... 查看详情

classloader的双亲委派机制(代码片段)

双亲委派模型工作过程是:如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成。每个类加载器都是如此,只有当父加载器在自己的搜索范围内找不到指定的类时(即... 查看详情