双亲委派机制存在的意义

双亲委派只是一种说法,个人觉得叫单亲委派更合适,因为向上传递的父类只有一个,估计只是翻译过来的,形成的一种习惯,大家可以当做单亲委派

四种加载器都是用于类的加载,只是加载的对象不一样

bootstrap ClassLoader -负责核心JRE的类库加载,如rt.jar, charsets.jar等

Extension ClassLoader -负责加载拓展目录ext中的jar类包

Application ClassLoader -负责加载ClassPath路径下的类包

User ClassLoader -负责加载用户自定义路径下的类包

  • 向上传递

    向上传递啥?

    为什么要传递?
  • 向下传递

    向下传递啥?

    为啥要传递?

    为什么一下向上传?一下又向下传?

当一个类要被加载时,首先要去找类加载器。它会首先向上传递,直至传递到启动类加载器,也就是最顶层的加载器

当传递到顶后,才开始向下搜索哪个加载器能加载指定的类,进行真正的类加载

那么估计有些人就有疑问,为什么向上又向下,直接找到指定的类加载器不就ok吗?

其实,双亲委派机制是一种安全机制。

确定唯一性,任何一个类判断是否相等,还需要判断是否是同一个类加载器加载的。

同时,它能够有效避免源码被污染。看下面的例子

package java.lang;

public class String {

public void test(){

System.out.println("test");

}

public static void main(String[] args) {

}

}

试想,上面的代码是用户自定的java.lang.String,它能否执行成功呢?

答案肯定是不行的,如果可以,那java语言的源码岂不是可以随意污染。执行结果如下

意思就是说在java.lang.String中没有main方法。那我们看下官方提供的源码

可以看到在源码中,搜索main方法也是不存在的。

那有人就会说,我自己写的java.lang.String中不是有吗?这时候就要和双亲委派有关了

看个图就明白了

由于是自上到下加载,所以加载到启动器加载器时,就发现有同名包rt.jar中有java.lang.String

所以加载到的String不是用户自定义的,而是rt.jar包中的String类,所以才会报错,显示String中没有main方法

双亲委派机制的打破

上面讲了为什么要有双亲委派机制,为什么后面又要打破呢???

拿tomcat举例子吧

tomcat是web容器的一种,在tomcat中,往往一个class文件会被加载多次,因为不同用户每次访问都要加载一次,这样就会导致tomcat中会出现类冲突。那怎么避免冲突呢?

上面讲到标识唯一性,就是表示类的时候,类加载器也算是标识的一部分,所以对同一个class文件进行不同类加载器进行加载就是不同的类

关于打破双亲委派的参考链接

https://zhuanlan.zhihu.com/p/185612299

【JAVA开发】浅析双亲委派机制的更多相关文章

  1. 【Java_基础】java类加载过程与双亲委派机制

    1.类的加载.连接和初始化 当程序使用某个类时,如果该类还未被加载到内存中,则系统会通过加载.连接.初始化三个步骤来对类进行初始化.如果没有意外,jvm将会连续完成这三个步骤,有时也把这三个步骤统称为 ...

  2. JVM加载类的过程,双亲委派机制中的方法

    JVM加载类的过程: 1)JVM中类的整个生命周期: 加载=>验证=>准备=>解析=>初始化=>使用=>卸载  1.1.加载 类的加载阶段,主要是获取定义此类的二进 ...

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

    前言:最近两个月公司实行了996上班制,加上了熬了两个通宵上线,状态很不好,头疼.牙疼,一直没有时间和精力写博客,也害怕在这样的状态下写出来的东西出错.为了不让自己荒废学习的劲头和习惯,今天周日,也打 ...

  4. java安全沙箱(一)之ClassLoader双亲委派机制

    java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...

  5. 关于Java类加载双亲委派机制的思考(附一道面试题)

    预定义类加载器和双亲委派机制 JVM预定义的三种类型类加载器: 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib下面 ...

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

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

  7. java的类加载器体系结构和双亲委派机制

    类加载器将字节码文件加载到内存中,同时在方法区中生成对应的java.land.class对象  作为外部访问方法区的入口. 类加载器的层次结构: 引导类加载器<-------------扩展类加 ...

  8. Java虚拟机类加载器及双亲委派机制

    所谓的类加载器(Class Loader)就是加载Java类到Java虚拟机中的,前面<面试官,不要再问我"Java虚拟机类加载机制"了>中已经介绍了具体加载class ...

  9. 【java基础】- java双亲委派机制

    在了解双亲委派机制之前,你应当知道classloader(如果不了解,可以现在去恶补一下哈) 四种classloader 虚拟机自带 引导类加载器(Bootstrap ClassLoader) 扩展类 ...

随机推荐

  1. java实现rsa加密算法【5min快速应用教程】

    该篇文章的主要目的是让读者能够迅速应用到项目中,想要了解详细的rsa加密算法的,可以百度找到更多原理.深度分析的文章. RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一 ...

  2. 前端需要了解的颜色模型,RGB、HSL和HSV

    颜色模型,是用来表示颜色的数学模型.比如最常见的 RGB模型,使用 红绿蓝 三色来表示颜色. 一般的颜色模型,可以按照如下分类: 面向硬件设备的颜色模型:RGB,CMYK,YCrCb. 面向视觉感知的 ...

  3. yaml基本用法

    简介 YAML 是 "YAML Ain't Markup Language"(YAML 不是一种标记语言)的递归缩写.在开发的这种语言时,YAML 的意思其实是:"Yet ...

  4. 反射的妙用:C#通过反射动态生成类型继承接口并实现

    起因 最近想自己鼓捣个RPC,想着简化RPC调用方式,直接申明接口,然后根据接口的属性去配置RPC调用的相关信息.有一种说法叫申明式调用. 简单来说就是,申明一个interface,动态继承并实例化, ...

  5. 快速排序平均时间复杂度O(nlogn)的推导

    快速排序作为随机算法的一种,不能通过常规方法来计算时间复杂度 wiki上有三种快排平均时间复杂度的分析,本文记录了一种推导方法. 先放快速排序的伪代码,便于回顾.参考 quicksort(int L, ...

  6. 那一天,我被Redis主从架构支配的恐惧

    面试官:要不你来讲讲你最近在看的点呗?可以拉出来一起讨论下(今天我也不知道要问什么) 候选者:最近在看「Redis」相关的内容 面试官:嗯,我记得已经问过Redis的基础和持久化了 面试官:要不你来讲 ...

  7. 面霸篇:Java 集合容器大满贯(卷二)

    面霸篇,从面试角度作为切入点提升大家的 Java 内功,所谓根基不牢,地动山摇. 码哥在 <Redis 系列>的开篇 Redis 为什么这么快中说过:学习一个技术,通常只接触了零散的技术点 ...

  8. [luogu4548]歌唱王国

    (可以参考hdu4652,因此推导过程比较省略) 类似的定义$f_{i}$和$g_{i}$,同样去插入$len$个字符,但注意到并不是任意一个位置都可以作为结尾,$i+j$可以作为结尾当且仅当$s[0 ...

  9. 语音合成论文翻译:2019_MelGAN: Generative Adversarial Networks for Conditional Waveform Synthesis

    论文地址:MelGAN:条件波形合成的生成对抗网络 代码地址:https://github.com/descriptinc/melgan-neurips 音频实例:https://melgan-neu ...

  10. 异常处理截止和UML图

    0.异常处理机制 0.1.java中异常的作用是:增强程序健壮性. 0.2.java中异常以类和对象的形式存在. 1.java的异常处理机制 1.1.异常在java中以类和对象的形式存在.那么异常的继 ...