当前位置: 首页 > 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…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

【机器视觉】单目测距——运动结构恢复

ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛&#xf…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Java编程之桥接模式

定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)&#xff…...