java双亲委派机制及作用

南望孤笑      2022-05-03     122

关键词:

什么是双亲委派机制

当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。

类加载器的类别

BootstrapClassLoader(启动类加载器)

c++编写,加载java核心库 java.*,构造ExtClassLoaderAppClassLoader。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作

ExtClassLoader (标准扩展类加载器)

java编写,加载扩展库,如classpath中的jrejavax.*或者
java.ext.dir 指定位置中的类,开发者可以直接使用标准扩展类加载器。

AppClassLoader(系统类加载器)

java编写,加载程序所在的目录,如user.dir所在的位置的class

CustomClassLoader(用户自定义类加载器)

java编写,用户自定义的类加载器,可加载指定路径的class文件

源码分析

protected Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // 首先检查这个classsh是否已经加载过了
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    // c==null表示没有加载,如果有父类的加载器则让父类加载器加载
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        //如果父类的加载器为空 则说明递归到bootStrapClassloader了
                        //bootStrapClassloader比较特殊无法通过get获取
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {}
                if (c == null) {
                    //如果bootstrapClassLoader 仍然没有加载过,则递归回来,尝试自己去加载class
                    long t1 = System.nanoTime();
                    c = findClass(name);
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

 

委派机制的流程图

 

双亲委派机制的作用

1、防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
2、保证核心.class不能被篡改。通过委托方式,不会去篡改核心.clas,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。


作者:秦时的明月夜
链接:https://www.jianshu.com/p/1e4011617650
来源:简书

双亲委派机制

类加载器双亲委派模型图双亲委派模型构成启动类加载器,扩展类加载器,应用程序类加载器,自定义类加载器双亲委派模型工作过程是如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求... 查看详情

jvm之类加载器加载过程及双亲委派机制

JVM的生命周期虚拟机的启动Java虚拟机的启动是通过引导类加载器(bootstrapclassloader)创建一个初始类(initialclass)来完成的,这个类是由虚拟机的具体实现指定的。虚拟机的执行一个运行中的Java虚拟机有着一个清晰的任务:执... 查看详情

jvm之类加载器加载过程及双亲委派机制

JVM的生命周期虚拟机的启动Java虚拟机的启动是通过引导类加载器(bootstrapclassloader)创建一个初始类(initialclass)来完成的,这个类是由虚拟机的具体实现指定的。虚拟机的执行一个运行中的Java虚拟机有着一个清晰的任务:执... 查看详情

java中常见的类加载器及双亲委派机制的原理(代码片段)

相信不少的同学在面试的时候会被问到一个词:双亲委派,懂得同学懂,不懂的同学可能会尴尬一笑,那么今天咱们就来聊聊这个问题的原理,首先我们需要了解一下java中常见的几种类加载器。一、Java中常见... 查看详情

节:双亲委派机制的工作原理及演示

...,接下来我们还得了解并掌握一个新的知识,即双亲委派机制。一提到双亲委派机制,大家的第一印象可能是觉得该机制理解起来应该会比较复杂,实则不然啊,它理解起来其实还算是简单的了。此外,有... 查看详情

节:双亲委派机制的工作原理及演示

...,接下来我们还得了解并掌握一个新的知识,即双亲委派机制。一提到双亲委派机制,大家的第一印象可能是觉得该机制理解起来应该会比较复杂,实则不然啊,它理解起来其实还算是简单的了。此外,有... 查看详情

节:双亲委派机制的工作原理及演示

...,接下来我们还得了解并掌握一个新的知识,即双亲委派机制。一提到双亲委派机制,大家的第一印象可能是觉得该机制理解起来应该会比较复杂,实则不然啊,它理解起来其实还算是简单的了。此外,有... 查看详情

[五]类加载机制双亲委派机制底层代码实现原理源码分析java类加载双亲委派机制是如何实现的

 Launcher启动类 本文是双亲委派机制的源码分析部分,类加载机制中的双亲委派模型对于jvm的稳定运行是非常重要的不过源码其实比较简单,接下来简单介绍一下 我们先从启动类说起 有一个Launcher类  sun.misc.Launcher; &nb... 查看详情

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

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

从源码理解双亲委派机制,原来如此简单(代码片段)

...介绍类加载机制的几个硬核问题:1从JDK源码级别剖析双亲委派机制原理2自定义类加载器研究如何打破双亲委派机制3.理解Tomcat的沙箱安全机制目录1双亲委派机制介绍2双亲委派机制实现原理3.打破双亲委派机制4Tomcat的沙箱机... 查看详情

android类加载机制

Android类加载机制双亲委派Android中主要的类加载机制Class文件的加载Class.forName&ClassLoader.loadClass有何不同双亲委派什么是双亲委派?双亲委派是如何实现的?双亲委派的作用Android中主要的类加载机制Class文件的加载Class.f... 查看详情

android类加载机制

Android类加载机制双亲委派Android中主要的类加载机制Class文件的加载Class.forName&ClassLoader.loadClass有何不同双亲委派什么是双亲委派?双亲委派是如何实现的?双亲委派的作用Android中主要的类加载机制Class文件的加载Class.f... 查看详情

jvm专题四:类加载子系统双亲委派机制

2.双亲委派机制 2.1双亲委派机制工作原理 2.1.1原理 Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存,生成class对象。 加载某个类的class文件时,Java虚拟机... 查看详情

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

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

java类加载过程以及双亲委派机制

...么本次博客的主题我选择了java的类加载过程的探究以及双亲委派机制模型以及它被破坏的场景,搞清楚这个对于我们理解java 查看详情

jvm--双亲委派机制

要了解双亲委派机制得先了解个概念:类加载器:“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块成为... 查看详情

jvm初探(一):双亲委派机制(代码片段)

目录一、JVM初探1.1JVM的位置1.2JVM体系结构二、双亲委派机制2.1类加载器2.2面试问题三、沙箱安全机制3.1什么是沙箱3.2组成沙箱的基本条件一、JVM初探JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计算机设备的规范... 查看详情

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

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