通俗易懂的双亲委派机制
当你超过别人一点点,别人会嫉妒你;当你超过别人一大截,别人就会羡慕你
据说给我点关注的都成了大佬,点关注的我都会私发一份好东西
呕心沥血半年之作,进去不点赞你回来骂我https://blog.csdn.net/codeyanbao/article/details/111569150
你得先知道
在介绍双亲委派机制的时候,不得不提ClassLoader(类加载器)。说ClassLoader之前,我们得先了解下Java的基本知识。
Java是运行在Java的虚拟机(JVM)中的,但是它是如何运行在JVM中了呢?我们在IDE中编写的Java源代码被编译器编译成.class的字节码文件。然后由我们得ClassLoader负责将这些class文件给加载到JVM中去执行。
JVM中提供了三层的ClassLoader:
Bootstrap classLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。
ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar。
AppClassLoader:主要负责加载应用程序的主函数类
那如果有一个我们写的Hello.java编译成的Hello.class文件,它是如何被加载到JVM中的呢?别着急,请继续往下看。
双亲委派机制
我打开了我的AndroidStudio,搜索了下“ClassLoader”,然后打开“java.lang”包下的ClassLoader类。然后将代码翻到loadClass方法:
public Class<?> loadClass(String name) throws ClassNotFoundException {return loadClass(name, false);}// -----??-----protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{// 首先,检查是否已经被类加载器加载过Class<?> c = findLoadedClass(name);if (c == null) {try {// 存在父加载器,递归的交由父加载器if (parent != null) {c = parent.loadClass(name, false);} else {// 直到最上面的Bootstrap类加载器c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.c = findClass(name);}}return c;}
其实这段代码已经很好的解释了双亲委派机制,为了大家更容易理解,我做了一张图来描述一下上面这段代码的流程:
从上图中我们就更容易理解了,当一个Hello.class这样的文件要被加载时。不考虑我们自定义类加载器,首先会在AppClassLoader中检查是否加载过,如果有那就无需再加载了。如果没有,那么会拿到父加载器,然后调用父加载器的loadClass方法。父类中同理也会先检查自己是否已经加载过,如果没有再往上。注意这个类似递归的过程,直到到达Bootstrap classLoader之前,都是在检查是否加载过,并不会选择自己去加载。直到BootstrapClassLoader,已经没有父加载器了,这时候开始考虑自己是否能加载了,如果自己无法加载,会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException。那么有人就有下面这种疑问了?
为什么要设计这种机制
这种设计有个好处是,如果有人想替换系统级别的类:String.java。篡改它的实现,在这种机制下这些系统的类已经被Bootstrap classLoader加载过了(为什么?因为当一个类需要加载的时候,最先去尝试加载的就是BootstrapClassLoader),所以其他类加载器并没有机会再去加载,从一定程度上防止了危险代码的植入。
总结了一张脑图如下:
参加CSDN 1024当天比赛文章,学Java的看完不点赞你再来打我
想成为Java开发专家,了解这些还远远不够,我这里总结了一些Java知识的史上最全脑图:
等等等还有五十几张脑图等着你,不光是脑图,知识点的讲解也会在下面的公众号第一时间发布哦,赶紧来关注吧~
微信搜索:IT烂笔头 或者微信扫描二维码,关注回复【职场】获得作者好友位
通俗易懂的双亲委派机制相关推荐
- JVM 双亲委派机制(通俗易懂)
类加载器 Java是运行在Java的虚拟机(JVM)中的,我们在IDE中编写的Java源代码被编译器编译成.class的字节码文件.然后ClassLoader负责将这些class文件加载到JVM中去执 ...
- 阿里预面:谈谈你对双亲委派机制的理解?这个名字有啥问题?如何打破?为啥双亲委派?...
前情回顾 秋招面试中,我每次面试似乎都被问到关于JVM双亲委派的相关问题. 我先考考你:你是怎么理解双亲委派机制的?这个名字你有没有觉得有问题?能举个简单例子说明一些双亲委派吗?双亲委派有何好处?如何 ...
- 简单的Java双亲委派机制
双亲委派机制 Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象,而且加载某个类的class文件时,Java虚拟机采用的 ...
- 【JVM】类加载器:双亲委派机制、沙箱安全机制
· 双亲委派机制.沙箱安全机制是JVM中类加载器系统的相关术语 · 在这之前,应该先了解JVM类加载器系统的相关概念 一.类加载器基础知识 见下图1,java文件首先会被编译成class文件,clas ...
- 【Java 虚拟机原理】Android 类加载机制 ( 双亲委派机制 | BootClassLoader | PathClassLoader | DexClassLoader )
文章目录 一.Android 类加载机制 二.双亲委派机制 一.Android 类加载机制 Android 中的类加载 使用了 双亲委派 机制 , 如下图所示 : 在 Android 中提供了 333 ...
- JVM-白话聊一聊JVM类加载和双亲委派机制源码解析
文章目录 Java 执行代码的大致流程 类加载loadClass的步骤 类加载器和双亲委派机制 sun.misc.Launcher源码解析 Launcher实例化 Launcher 构造函数 双亲委派 ...
- Tomcat - 都说Tomcat违背了双亲委派机制,到底对不对?
文章目录 类加载的本质 JVM 双亲委派机制 BootstrapClassLoader(启动类加载器) ExtensionClassLoader AppClassLoader Tomcat的 类加载顺 ...
- 破坏双亲委派机制的那些事
前言 今天重读<深入理解Java虚拟>这本书,读到破坏双亲委派机制这一小节,其中有一段话,如下 双亲委派模型的第二次"被破坏"是由这个模型自身的缺陷所导致的,双亲委派很 ...
- java安全沙箱(一)之ClassLoader双亲委派机制
java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...
最新文章
- win7如何更改文件类型_教你win7局域网设置方法
- HttpClient超时重复提交问题
- 进程间程序替换和minishell
- 如何利用Excel计算有多少种组合?
- oracle 转换成csv文件,如何将csv转换为oracle中的表
- 拼题a答案c语言计算整数各位数字之和,这是小白刷的基础题,跪求大佬帮忙!!!题目:读入一个自然数n...
- 百度员工离职总结:如何做个好员工?(转)
- ajax data传值
- 鲁瑜计算机,程序员计算器.pptx
- 概率论与数理统计大纲
- 激活Window和office工具
- C语言 简单的文件下载器
- 用python根据最新的汇率,假设你要出国留学要换外币,输入一定数量的人民币,比如1000元人民币, 按照中国银行的现钞卖出价,输出可换到对应的加元和澳元分别是多少。
- 谷歌工具栏不再支持火狐浏览器
- 计算机网络通信模型之cs模式(一)简单的socket
- 网络安全学习笔记——DNS漏洞
- 写给一个外汇女交易员的信(连载六)
- 【原创】BERT知识融合
- SSH 通过跳板机连接远程主机
- Text-to-Table: A New Way of Information Extraction