码迷,mamicode.com
首页 > 其他好文 > 详细

双亲委派机制

时间:2020-06-02 10:58:15      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:exception   文件加载   不能   一个   custom   blog   递归   load   extension   

前言

我们在IDE中编写的Java源代码被编译器编译成.class的字节码文件。然后由ClassLoader(类加载器)负责将这些.class文件加载到JVM中去执行。

ClassLoader

Bootstrap ClassLoader(启动类加载器) 
    C++实现 在java里无法获取 负责加载<JAVA_HOME>/lib下的类
Extension ClassLoader (标准扩展类加载器) 
    Java实现 可以在java里获取 负责加载<JAVA_HOME>/lib/ext下的类
Application ClassLoader(系统类加载器)      
    代码默认就是由它来加载, ClassLoader.getSystemClassLoader返回的就是它

双亲委派机制

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

技术图片

1,Application ClassLoader 在自己的加载范围中查看是否加载过?  
    是->已经加载过则不再次加载  (如果之前加载过 Yegeniubi.class, 则到此就结束了, 然而野哥是第一次运行这个程序, 所以肯定没有被加载过)
    否->未加载过则交给父加载器 Extension ClassLoader
2,Extension ClassLoader 在自己的加载范围中查看是否加载过?  
    是->已经加载过则不再次加载  
    否->未加载过则交给父加载器 Bootstrap ClassLoader
3,Bootstrap ClassLoader 在自己的加载范围中查看是否加载过?  
    是->已经加载过则不再次加载  
    否->未加载过则判断自己是否可以加载此类
        是->可以加载此类则自己加载此类 
        否->不能加载则交给子加载器 Extension ClassLoader
4,Extension ClassLoader 判断是否可以加载此类 
    是->可以加载此类则自己加载此类 
    否->不能加载则交给子加载器 Application ClassLoader
5,Application ClassLoader 判断是否可以加载此类 
    是->可以加载此类则自己加载此类 (如果是第一次加载, 此时 Yegeniubi.class 将在这里被加载)
    否->ClassNotFoundException

 

上图中的CustomClassLoader是自定义类加载器, 可以作为打破双亲委派机制的的一种方式, 原理就是我们自己编写自定义类加载器, 在该类加载器中加载特定的.class文件, 那么就不会再继续委托给上级类加载器了

 

双亲委派机制的作用

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

 

打破双亲委派机制

为什么要打破双亲委派

如何打破双亲委派

 

双亲委派机制

标签:exception   文件加载   不能   一个   custom   blog   递归   load   extension   

原文地址:https://www.cnblogs.com/blazeZzz/p/13029865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!