博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类加载之双亲委派
阅读量:3906 次
发布时间:2019-05-23

本文共 1115 字,大约阅读时间需要 3 分钟。

前言-类加载

类加载是指将类从磁盘或网络中读到jvm内存,交给执行引擎执行

类加载类型

java中类加载有4种(系统提供3种,自定义1种,因此也有说法称只有2种)

  1. Bootstrap classLoader(启动类加载器):由C++编写,负责加载java核心类库,构造ExtClassLoader和AppClassLoader。对应加载的文件是**%JRE_HOME/lib/** 目录下的rt.jar、resources.jar、charsets.jar和class等,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作
  2. Extension ClassLoader(标准扩展类加载器): java编写,负责加载扩展库,对应加载的文件是**%JRE_HOME/lib/ext** 目录下的jar和class等,开发者可以直接使用标准扩展类加载器
  3. App ClassLoader(系统类加载器): java编写,负责加载应用程序的主函数类,对应加载的应用程序classpath目录下的所有jar和class等。
  4. CustomClassLoader(用户自定义类加载器):java编写,负责加载指定路径下的class文件

双亲委派机制

双亲委派机制是当类加载器需要加载某一个.class字节码文件时,则首先会把这个任务委托给他的上级类加载器,递归这个操作,如果上级没有加载该.class文件,自己才会去加载这个.class

向上委托向下查找
在这里插入图片描述

下面借用一下网图说明委派机制流程

在这里插入图片描述
不考虑我们自定义类加载器,首先会在AppClassLoader中检查是否加载过,如果有那就无需再加载了。如果没有,那么会拿到父加载器,然后调用父加载器的loadClass方法。父类中同理也会先检查自己是否已经加载过,如果没有再往上。注意这个类似递归的过程,直到到达Bootstrap classLoader之前,都是在检查是否加载过,并不会选择自己去加载。直到BootstrapClassLoader,已经没有父加载器了,这时候开始考虑自己是否能加载了,如果自己无法加载,会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException

双亲委派的作用

-防止加载同一个class文件

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

转载地址:http://rugen.baihongyu.com/

你可能感兴趣的文章
.NET Core + Spring Cloud:服务注册与发现
查看>>
今天你内卷了吗?
查看>>
设计模式之代理模式
查看>>
在 MySQL 中使用码农很忙 IP 地址数据库
查看>>
结构型设计模式总结
查看>>
dotNET:怎样处理程序中的异常(实战篇)?
查看>>
What is 测试金字塔?
查看>>
api接口返回动态的json格式?我太难了,尝试一下 linq to json
查看>>
.Net Core HttpClient处理响应压缩
查看>>
十分钟搭建自己的私有NuGet服务器-BaGet
查看>>
efcore 新特性 SaveChanges Events
查看>>
龙芯3A5000初样顺利交付流片
查看>>
用了Dapper之后通篇还是SqlConnection,真的看不下去了
查看>>
ABP快速开发一个.NET Core电商平台
查看>>
[NewLife.Net]单机400万长连接压力测试
查看>>
使用Azure人脸API对图片进行人脸识别
查看>>
快醒醒,C# 9 中又来了一堆关键词 init,record,with
查看>>
【招聘(深圳)】轻岁 诚聘.NET Core开发
查看>>
await,async 我要把它翻个底朝天,这回你总该明白了吧
查看>>
.NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中
查看>>