双亲委派机制存在的意义

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

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

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. python 处理xml 数据

    1 import xml.sax 2 import xml.sax.handler 3 4 # python 处理xml 数据 类,将xml数据转化为字典 5 ''' 6 原数据:<?xml v ...

  2. Linux ps -ef 命令输出解释

    UID: 程序拥有者PID:程序的 IDPPID:程序父级程序的 IDC:  CPU 使用的百分比STIME: 程序的启动时间TTY: 登录终端TIME : 程序使用掉 CPU 的时间CMD: 下达的 ...

  3. glibc memcpy() 源码浅谈

    其实我本来只是想搞懂为什么memcpy()函数的参数类型是void *的: 我以为会在memcpy()源码中能找到答案,其实并没有,void *只是在传递参数的时候起了作用,可以让memcpy()接受 ...

  4. C++ 函数模板和函数重载同时出现如何调用

    C++ 函数模板和函数重载同时出现如何调用 重点 函数模板不允许自动转换,普通函数可以进行自动类型转换 函数模板可以像普通函数一样被重载 C++编译器优先考虑调用普通函数 如果函数模板可以产生一个更好 ...

  5. webpack 打包样式资源

    webpack 打包样式资源 webpack.config.js配置文件内容为: // 用来拼接绝对路径的方法 const {resolve} = require('path') module.exp ...

  6. Linux mem 2.5 Buddy 内存回收机制

    文章目录 1. 简介 2. LRU 组织 2.1 LRU 链表 2.2 LRU Cache 2.3 LRU 移动操作 2.3.1 page 加入 LRU 2.3.2 其他 LRU 移动操作 3. LR ...

  7. SpringBoot 整合 Docker

    最近备忘录新加的东西倒是挺多的,但到了新环境水土不服没动力去整理笔记 1. Demo Project 首先准备一个简单的项目,用来部署到 Docker 主机上,并且能验证该项目是否成功运行 1.1 接 ...

  8. Part 32 AngularJS controller as syntax

    So far in this video series we have been using $scope to expose the members from the controller to t ...

  9. 从零开始制作一个linux iso镜像

    一.前言     对于一个极简化的linux系统而言,只需要三个部分就能组成,它们分别是一个linux内核.一个根文件系统和引导.以下是本文制作linux iso镜像所用到的系统和软件:     OS ...

  10. 大爽Python入门教程 0-1 安装python

    大爽Python入门公开课教案 点击查看教程总目录 一 如何找到下载地址并下载 下面展示找到下载地址的方法步骤 嫌步骤太慢可直接跳到第4步, 查看详细下载地址 使用搜索引擎搜索python 打开搜索结 ...