双亲委派机制存在的意义

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

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

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. hdu 5166 Missing number(。。。)

    题意: 有一个排列,但少了两个数.给你少了这两个数的排列.找出是哪两个数. 思路: 看代码,,, 代码: int a[1005]; int main(){ int T; cin>>T; w ...

  2. 【mysql1】如何删除MySQL内存|不再跟新系列

    完全卸载mysql的具体步骤: 包括停止服务  +  卸载相关程序  +  删除注册表等等 步骤一:  windows键+R-->Control-->程序和功能:所有MySQL程序点击右键 ...

  3. GitHub 开源的小工具「GitHub 热点速览 v.21.45」

    作者:HelloGitHub-小鱼干 Copilot 是 GitHub 官方出品的代码自动补全工具,之前使用该工具需要有一定的要求.而本周靠 2k+ star 上热点的 copilot-docs 则是 ...

  4. c++ template 实现一个简单的"栈"

    一: 实现一个简单的swap 原来我们写swap一定会这样写: 对于int类型的: swap(const int &x,const int &y) { int temp; temp = ...

  5. 利用DNS缓存和TLS协议将受限SSRF变为通用SSRF

    本文首发于先知社区 前言 这是今年BlackHat上的一个议题:When TLS Hacks You,作者是latacora的Joshua Maddux 议题提出了一个新的ssrf攻击思路,利用DNS ...

  6. Effective Python(3)- 了解 bytes 与 str 的区别

    Python 有两种类型可以表示字符序列 bytes:实例包含的是原始数据,即 8 位的无符号值(通常按照 ASCII 编码标准来显示) str:实例包含的是 Unicode 码点(code poin ...

  7. Part 61 to 63 Talking about partial class and partial method in C#

    部分类和部分方法 部分类是用partial声明的类,它允许我们把一个类分割成两个或多个类,当应用程序编译的完成的时候,多个部分类会结合成一个类,同时partial关键字也可以用于声明结构和接口. 那么 ...

  8. 环境(8)Linux用户组权限

    一:Linux时间日期-时间同步策略 1.日期与时间 ①时间命令 data:查看当前系统时间 cal :查看日历     cal  2020 修改时间:   date -s  11:11:11    ...

  9. Python 爬取 房天下

    ... import requests from requests import ConnectionError from bs4 import BeautifulSoup import pymong ...

  10. 【linux系统】java环境搭建

    搭建步骤 1.安装java : 上传java安装包到linux系统----- rz jdk-8u202-linux-x64.tar.gz jdk下载地址:https://www.oracle.com/ ...