当前位置: 首页 > news >正文

【JVM】类加载器 Bootstrap、Extension、Application、User Define 以及 双亲委派

以下环境为 jdk1.8

两大类

分类成员语言继承关系
引导类加载器bootstrap 引导类加载器C/C++
自定义类加载器extension 拓展类加载器、application 系统/应用类加载器、user define 用户自定义类加载器Java继承于 java.lang.ClassLoader

四小类

Bootstrap 引导类加载器

负责加载以下路径中 jar 包里的类
public class BootstrapClassLoader {public static void main(String[] args) {URL[] urls = Launcher.getBootstrapClassPath().getURLs();for (URL url : urls) {System.out.println(url.toExternalForm());}}
}

Extension 扩张类加载器

由 Bootstrap 加载,并将 Bootstrap 指定为 Extension 的父加载器

负责加载以下路径中 jar 包里的类
public class ExtensionClassLoader {public static void main(String[] args) {for (String path : System.getProperty("java.ext.dirs").split(";")) {System.out.println(path);}}
}

Extension 还可以加载开发者放入 java.ext.dirs 中 jar 包里的类

Application/System 应用/系统类加载器

由 Bootstrap 加载,并将 Extension 指定为 Application 的父加载器

负责加载以下路径中 jar 包里的类

用户自己开发的类的 classpath,如 com.example.demo.XXXClass

package com.chen.main;public class MyMain {}

这个由用户创建的 com.chen.main.MyMain 类,就会由 Application 加载

为什么是由 Application 加载呢?这是因为类加载器的双亲委派(按下不表)

User Define 用户自定义类加载器

由 Application 加载,并将 Application 指定为 User Define 的父加载器

为什么要有 User Define 用户自定义加载器

我们写了这么久代码好像也没有使用过用户自定义类加载器啊,使用上面三种类加载器好像完全足够了。但是当有以下几种需求时,就需要使用用户自定义加载器来实现了:

  • 隔离加载类

隔离 应用服务 与 框架 与 中间件 直接类的加载,防止可能存在相同路径的类发生冲突

  • 修改类加载的方式

可以不使用 Extension 和 Application,让用户自定义类加载器在我们需要的时间点,加载我们所需的类

  • 扩展加载源

.class 文件一般以本地、网络、压缩包(zip、jar、war)等方式加载

而用户自定义类加载器可以自己扩展加载源,比如在数据库、文件(jsp)、加密文件、各种电子设备中加载 .class 文件

  • 防止源码泄露

我们写的 Java 程序生成的 .class 字节码文件很容易被反编译出源码。因此为了防止源码泄露,就需要给字节码加密,但是加密后的字节码就无法被 JVM 提供的类加载器加载了,需要我们自己实现能够加载加密字节码的类加载器

负责加载用户指定路径的类

双亲委派

什么是双亲,其实就是 parent 家长的意思,因此也可以理解为 "家长委派模式"

前面提到了 Extension 的父加载器是 Bootstrap、Application 的父加载器是 Extension,但是父加载器并不是父类的意思,他们中间不存在继承关系

所谓 "父加载器" 只是 ClassLoader 类中的一个属性,这个属性正是 parent

而 Extension 与 Application 都继承于 ClassLoader,因此都有这个属性

类加载流程

向上委派

当要一个类加载器要加载类的时候

  • 当前的类加载器没有加载过该类

会先将加载任务提交给父加载器(即委派给双亲)。如果父加载器也有父加载器,那么加载任务会继续提交给父父加载器,直到没有父类加载器为止(即 parent 为 null),但是 parent 为 null 并不代表没有父类加载器,而是表示该加载器的父加载器为 Bootstrap 引导类加载器(因为 Bootstrap 是用 C/C++ 写的,并不是一个 Java 对象,无法存入 parent 属性中)。也就是说,最终的加载任务都会给到 Bootstrap 引导类加载器

  • 当前的类加载器已经加载过该类

直接结束(最初加载器)/  告知子加载器 "加载完成"(非最初加载器)

向下委派

Bootstrap

  • 该类在 Bootstrap 类加载器负责的加载路径下

Bootstrap 完成该类的加载任务,并告知将任务委派给他的子加载器 "我搞定了"(完成该任务)

  • 该类不在 Bootstrap 类加载器负责的加载路径下

Bootstrap 无法完成该类的加载任务,只能通知子加载器 "我搞不定,你自己试试看",将任务退回给子加载器(拒绝该任务)

子加载器

  • 该类在子加载器负责的加载路径下

子加载器完成该类的加载任务,并告知将任务委派给他的子子加载器 "我搞定了"(完成该任务)

  • 该类不在子加载器负责的加载路径下

子加载器无法完成该类的加载任务,只能通知子子加载器 "我搞不定,你自己试试看",将任务退回给子子加载器(拒绝该任务)

最初加载器

当最初加载器的所有祖宗都拒绝了最初加载器向上委派的类加载任务,它就只能自己来尝试加载了

  • 该类在最初加载器负责的加载路径下

最初加载器完成该类的加载任务

  • 该类不在子加载器负责的加载路径下

最初加载器无法完成该类的加载任务,由于它已经没有可以再向下委派的子加载器了,最终只能抛出 ClassNotFound 异常(在所有可加载的路径下,找不到这个类)

作用

避免重复加载类

比如 A 类和 B 类都有一个父类 C 类,那么当 A 启动时就会将 C 类加载起来,那么在 B 类进行加载时就不需要在重复加载 C 类了

确保程序安全性

使用双亲委派模型可以保证了 Java 的核心 API 不被篡改,如果没有使用双亲委派模型,而是每个类加载器自己加载就会出现一些问题。比如我们自己编写一个名为 java.lang.Object 类,那么程序运行的时候,AppClassLoader 就会加载这个 Object 类,如果我们写的 Object 类有问题,那么所有继承于 Object 类的类就会全部出错,整个程序直接崩溃 down 掉
 

相关文章:

【JVM】类加载器 Bootstrap、Extension、Application、User Define 以及 双亲委派

以下环境为 jdk1.8 两大类 分类成员语言继承关系引导类加载器bootstrap 引导类加载器C/C无自定义类加载器extension 拓展类加载器、application 系统/应用类加载器、user define 用户自定义类加载器Java继承于 java.lang.ClassLoader 四小类 Bootstrap 引导类加载器 负责加…...

读书笔记:彼得·德鲁克《认识管理》第15章 使工作富有成效:工作和过程

一、章节内容概述 不同员工在技术熟练程度、知识掌握程度方面有所不同,但所有工 作本质上都是相同的,为了实现富有成效,需要遵循同样的步骤,划分 为同样的阶段,受到同样的对待,需要分析、综合、控制以及相…...

媒体软文投放的流程与媒体平台的选择

海内外媒体软文:助力信息传播与品牌建设 在当今数字化时代,企业如何在庞大的信息海洋中脱颖而出,成为品牌建设的领军者?媒体软文投放无疑是一项强大的策略,通过选择合适的平台,精准投放,可以实…...

【excel技巧】如何取消excel隐藏?

Excel工作表中的行列隐藏了数据,如何取消隐藏行列呢?今天分享几个方法给大家 方法一: 选中隐藏的区域,点击右键,选择【取消隐藏】就可以了 方法二: 如果工作表中有多个地方有隐藏的话,还是建…...

AIGC专栏8——EasyPhoto 视频领域拓展-让AIGC肖像动起来

AIGC专栏8——EasyPhoto 视频领域初拓展-让AIGC肖像动起来 学习前言源码下载地址技术原理储备Video Inference 功能说明 & 效果展示1、Text2Video功能说明a、实现原理简介b、文到视频UI介绍c、结果展示 2、Image2Video功能说明a、实现原理简介i、单图模式ii、首尾图模式 b、…...

C++ RBTree 理论

目录 这个性质可以总结为 红黑树的最短最长路径 红黑树的路径范围 code 结构 搞颜色 类 插入 插入逻辑 新插入节点 思考:2. 检测新节点插入后,红黑树的性质是否造到破坏? 解决方法 变色 旋转变色 第三种情况,如果根…...

制作这种在线宣传画册,可轻松收获客户!

制作企业宣传画册,首先要了解企业制作宣传画册的需求以及展示方向,如今互联网时代,宣传画册的制作也应该要创新,而制作一本在线电子宣传画册用于线上宣传是非常有必要的。如何制作呢? 我们 可以使用FLBOOK平台在线制作…...

数据结构 | 图

最小生成树算法 Prime算法 算法思路:从已选顶点所关联的未选边中找出权重最小的边,并且生成树不存在环。 其中,已选顶点是构成最小生成树的结点,未选边是不属于生成树中的边。 例子: 第一步: 假设我们从顶…...

[文件读取]shopxo 文件读取(CNVD-2021-15822)

1.1漏洞描述 漏洞编号CNVD-2021-15822漏洞类型文件读取漏洞等级⭐⭐漏洞环境VULFOCUS攻击方式 描述: ShopXO是一套开源的企业级开源电子商务系统。 ShopXO存在任意文件读取漏洞,攻击者可利用该漏洞获取敏感信息。 1.2漏洞等级 高危 1.3影响版本 ShopXO 1.4漏洞复现…...

zookeeper应用之分布式锁

在分布式系统中多个服务需要竞争同一个资源时就需要分布式锁,这里使用zookeeper的临时顺序节点来实现分布式锁。 在节点X下创建临时顺序节点,getChildren()获取节点X的所有子节点,判断当前节点是否是第一个子节点,如果是就获取锁…...

20. 机器学习——PCA 与 LDA

机器学习面试题汇总与解析——PCA 与 LDA 本章讲解知识点 什么是数据降维PCA本专栏适合于Python已经入门的学生或人士,有一定的编程基础。 本专栏适合于算法工程师、机器学习、图像处理求职的学生或人士。 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是一…...

深度学习准召

准确率(Precision)和召回率(Recall)是两个用来评价一个模型的好坏的指标,它们有不同的意义: 准确率(Precision):准确率是在所有被模型判断为正例的样本中,有…...

AtCoder ABC154

C - Distinct or Not 签到题,注意大小写和以前的不一样 D - Dice in Line 签到题2,用个窗口即可 E - Almost Everywhere Zero 数位DP(搜索)的例题 pos表示当前搜索到的位置(开始为0,结束为n) …...

可以非常明显地感受到,一场有关直播带货的暗流正在涌动

虽然有关直播带货的争论依然还在持续,但是,我们依然无法否认今年的双十一依然是直播带货的高光时刻。无论是以淘宝、京东和拼多多为代表的传统电商平台,还是以抖音、快手为代表的新电商平台,几乎都将今年双十一的重心放在了直播带…...

C++中的四种构造函数

在C中,有几种不同类型的构造函数,基于它们的特性和用途,可以将它们分类为以下四种: 默认构造函数(Default Constructor): 如果没有为类定义任何构造函数,编译器将为其提供一个默认构造函数。这种…...

通过反射获取某个对象属性是否存在,并获取对象值

SneakyThrowspublic static void main(String[] args) {User user new User("张三", 10);// 获取指定属性名的值String propertyName "name2";Field[] fields user.getClass().getDeclaredFields();// 输出属性名Boolean flag false;for (Field field …...

【MySQL】存储过程与函数

一、存储过程 1、什么是存储过程 它是一组经过预先编译的SQL的封装它被存储在MySQL服务器上,当需要执行它时,客户端只需要向服务器发出调用命令,就可以把这一系列预先存储好的SQL语句全部执行 2、存储过程的优缺点 优点 简化操作&#xf…...

【数学】Pair of Topics—CF1324D

Pair of Topics—CF1324D 思路 很明显,需要对 a i a j > b i b j a_i a_j > b_i b_j ai​aj​>bi​bj​ 化简: a i − b i > b j − a j a_i - b_i > b_j - a_j ai​−bi​>bj​−aj​ a i − b i > − ( a j − b j ) a_…...

Qt文档阅读笔记-Fetch More Example解析

Fetch More Example这个例子说明了如何在视图模型上添加记录。 这个例子由一个对话框组成,在Directory的输入框中,可输入路径信息。应用程序会载入路径信息的文件信息等。不需要按回车键就能搜索。 当有大量数据时,需要对视图模型进行批量增…...

QtC++与QTableView详解

介绍 QTableView 是 Qt 框架中用于显示表格数据的视图控件,它是 QAbstractItemView 类的子类。QTableView 通常与 QStandardItemModel 或者自定义的数据模型一起使用,用于展示二维表格型数据。以下是对 QTableView 的详细讲解和在 Qt 中的作用&#xff…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求&#xff…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

基于Springboot+Vue的办公管理系统

角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...