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

java-双亲委派机制

Java虚拟机(JVM)中的类加载器(Class Loader)负责将类(.class文件)加载到JVM中,以便Java程序能够使用这些类。在JVM中,类加载器被组织成一种层次结构关系,这种层次结构关系中的类加载器遵循一种被称为“双亲委派模型”(Parent-First Delegation Model)的加载机制。以下是关于双亲委派机制的详细解释。
### 双亲委派模型简介
双亲委派模型要求除了顶层的启动类加载器(Bootstrap Class Loader)外,其余的类加载器都应当有自己的父类加载器。类加载器在尝试自己加载类之前,首先委托给父类加载器进行加载,只有当父类加载器加载失败(即在它的搜索范围内没有找到所需的类)时,子类加载器才会尝试自己加载该类。
### 工作原理
#### 1. 类加载器层次结构
在Java中,类加载器大致可以分为以下几种:
- **启动类加载器(Bootstrap Class Loader)**:这是JVM中最顶层的类加载器,负责加载Java标准库中的类,如`rt.jar`中的类。它是用原生代码(如C/C++)实现的,是JVM的一部分。
- **扩展类加载器(Extension Class Loader)**:负责加载Java的扩展库(`jre/lib/ext`目录或者由系统属性`java.ext.dirs`指定的目录下的类库)。
- **应用程序类加载器(Application Class Loader)**:负责加载用户类路径(ClassPath)上的所有类库。
这些类加载器之间的关系是:启动类加载器没有父类加载器,扩展类加载器的父类加载器是启动类加载器,应用程序类加载器的父类加载器是扩展类加载器。
#### 2. 加载过程
当一个类需要被加载时,以下过程会被执行:
1. **检查缓存**:首先检查该类是否已经被加载过,如果有就直接返回,否则继续下一步。
2. **委派给父类加载器**:将类加载请求委派给父类加载器,父类加载器重复步骤1和2,直到达到启动类加载器。
3. **尝试加载**:如果父类加载器无法完成加载,则当前类加载器会尝试自己加载该类。
4. **定义类**:加载完成后,将类数据存入方法区(Method Area),并在Java堆(Heap)中创建一个对应的`java.lang.Class`对象用于封装类数据。
#### 3. 优点
- **避免类的重复加载**:当父类加载器已经加载了该类时,子类加载器无需再次加载,确保了同一个类在JVM中是唯一的。
- **保护程序安全**:通过双亲委派模型,Java核心API中定义的类型不会被随意替换,防止了核心API被篡改的风险。
### 特殊情况
尽管双亲委派模型是Java推荐使用的类加载器实现方式,但在某些情况下,它可能不适用或者需要被打破:
- **SPI(Service Provider Interface)**:JDBC、JNDI、JAXP等规范,它们允许用户通过接口来扩展服务,而这些接口的实现类可能是由不同的厂商提供的,因此需要由不同的类加载器来加载。
- **热部署**:在运行时更新应用程序的某些部分,而不需要重启整个应用程序,这就需要自定义类加载器来绕过双亲委派机制。
### 自定义类加载器
如果需要自定义类加载器,通常会有以下两种方式:
- **继承`java.lang.ClassLoader`**:覆盖`findClass`方法,遵循双亲委派模型。
- **继承`java.lang.ClassLoader`并覆盖`loadClass`方法**:完全打破双亲委派模型,自定义加载逻辑。
### 安全性考虑
双亲委派模型在安全性方面起到了重要作用,它确保了Java核心库的类型安全。但是,也有潜在的安全问题,比如类加载器可能会加载恶意的类文件。因此,以下措施可以增强安全性:
- **代码签名**:对类文件进行数字签名,类加载器在加载类之前验证签名。
- **访问控制**:限制类加载器加载特定路径下的类文件。
### 总结
双亲委派模型是Java虚拟机中类加载器的一种重要机制,它通过委派的方式确保了类的唯一性和安全性。尽管在某些特殊情况下需要打破这一模型,但双亲委派模型仍然是Java平台推荐和广泛使用的类加载方式。了解双亲委派模型的工作原理和实现方式,对于Java开发人员来说是非常重要的,它不仅有助于理解Java类的加载过程,还能在开发复杂Java应用时提供更多的灵活性和控制力。
 

相关文章:

java-双亲委派机制

Java虚拟机(JVM)中的类加载器(Class Loader)负责将类(.class文件)加载到JVM中,以便Java程序能够使用这些类。在JVM中,类加载器被组织成一种层次结构关系,这种层次结构关系…...

【C++】set的使用

🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 🌈前言🌈关于set🔥容量函数emptysize 🔥Modifiersinserteraseclear 🔥Operationsfindcountlower_bound和upper_…...

React 18【实用教程】(2024最新版)

搭建开发环境 含配置,react-developer-tools 和 Redux DevTools 下载安装 https://blog.csdn.net/weixin_41192489/article/details/138523829 JSX 语法 https://blog.csdn.net/weixin_41192489/article/details/138649165 组件 父子组件传值、兄弟组件传值、越层组…...

Perl语言入门学习指南

Perl语言(Practical Extraction and Report Language)是一种强大的脚本语言,以其灵活性和强大的文本处理能力而闻名。Perl广泛应用于系统管理、Web开发、网络编程和数据处理等领域。本文将带您入门Perl语言,介绍其基本语法、常用功…...

《Java8函数式编程》学习笔记汇总

前言 见证了java8的多层排序,为此想系统学习下java8的用法。 目录 简介Lambda表达式流高级集合类和收集器数据并行化测试、调试和重构设计和架构的原则使用Lambda表达式编写并发程序下一步改怎么办 后记...

C语言之封装,继承,多态

本文参考: c语言面向对象之封装c面向对象之继承Linux源码分析之多态 一、封装 封装的本质就是将数据和方法集中到一个对象中,c或者java使用的是class来实现。c语言中可以使用struct来实现同样的功能。比如下面的程序: struct student {int…...

GO内存分配详解

文章目录 GO内存分配详解一. 物理内存(Physical Memory)和虚拟内存(Virtual Memory)二. 内存分配器三. TCMalloc线程内存(thread memory)页堆(page heap)四. Go内存分配器mspanmcachemcentralmheap五. 对象分配流程六. Go虚拟内存ArenaGO内存分配详解 这篇文章中我将抽丝剥茧,…...

每日Attention学习12——Exterior Contextual-Relation Module

模块出处 [ISBI 22] [link] [code] Duplex Contextual Relation Network for Polyp Segmentation 模块名称 Exterior Contextual-Relation Module (ECRM) 模块作用 内存型特征增强模块 模块结构 模块思想 原文表述:在临床环境中,不同样本之间存在息肉…...

为什么现在电销公司这么难?

现在电销公司普遍底薪就4000,员工要干的工作: 1、自己办卡、现在大部分人对隐私方面比较在意,一般电销公司还都需要自己身份证实名办卡,打几天又封号,有的人甚至被移动拉黑 2、天天打电话,遇见的什么人都…...

每天一个数据分析题(四百四十二)- 标签与指标

数据分析师在工作中常常会涉及两个概念:标签、指标,下面关于标签与指标的描述正确的是()? A. 指标通常可以量化,但是标签一般是不可量化的 B. 标签是用来定义、评价和描述特定事物的一种标准或方式 C. 指…...

[论文笔记] pai-megatron-patch Qwen2-72B/7B/1.5B 长文本探路

[论文笔记] Pai-megatron-patch cpu-offload 改到 Qwen2-CSDN博客 Pai-Megatron-Patch (mcore代码) 长文本限制: 开SP之后,72B能开到16K,7B能开到32K。 但是72B开16K,或者7B开32K时,如果训练时训练样本中有长文本的话,则还是会OOM。 code: 相对于原repo加了一些代…...

【SpringCloud】微服务远程调用OpenFeign

工作原理流程图 上代码 common中添加依赖&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency><groupId>org.spri…...

MySQL零散拾遗(四)

聚合函数 聚合函数作用于一组数据&#xff0c;并对一组数据返回一个值。 常见的聚合函数&#xff1a;SUM()、MAX()、MIN()、AVG()、COUNT() 对COUNT()聚合函数的更深一层理解 COUNT函数的作用&#xff1a;计算指定字段在查询结果中出现的个数&#xff08;不包含NULL值&#…...

大语言模型-检索测评指标

1. MRR &#xff08;Mean Reciprocal Rank&#xff09;平均倒数排名&#xff1a; 衡量检索结果排序质量的指标。 计算方式&#xff1a; 对于每个查询&#xff0c;计算被正确检索的文档的最高排名的倒数的平均值&#xff0c;再对所有查询的平均值取均值。 意义&#xff1a; 衡量…...

Zookeeper集群中节点之间数据是如何同步的

1.首先集群启动时&#xff0c;会先进行领导者选举&#xff0c;确定哪个节点是Leader&#xff0c;哪些节点是Follower和Observer 2.然后Leader会和其他节点进行数据同步&#xff0c;采用发送快照和发送Diff日志的方式 3.集群在工作过程中&#xff0c;所有的写请求都会交给Lead…...

HTTPServer改进思路2(mudou库核心思想融入)

mudou网络库思想理解 Reactor与多线程 服务器构建过程中&#xff0c;不仅仅使用一个Reactor&#xff0c;而是使用多个Reactor&#xff0c;每个Reactor执行自己专属的任务&#xff0c;从而提高响应效率。 首先Reactor是一种事件驱动处理模式&#xff0c;其主要通过IO多路复用…...

Kubernetes Secret 详解

Kubernetes Secret 是一种用于存储和管理敏感信息的对象,如密码、OAuth 令牌和 SSH 密钥等。使用 Secret 可以避免将机密数据直接放在 Pod 规约或容器镜像中,从而增加了应用程序的安全性。 Secret 的类型 Kubernetes 支持多种类型的 Secret,包括: ​​Opaque​​:默认的…...

docker笔记4-部署

docker笔记4-部署 一、部署nginx二、部署Tomcat三、部署ESKibana3.1 部署ES3.2 部署kibana 一、部署nginx docker search nginx #搜索nginx的最新版本docker pull nginx #这里可以指定nginx版本&#xff0c;如果不指定&#xff0c;那么就拉取最新版本latestdocker run -d --na…...

有监督学习基础

基本概念 给定输入有为&#xff08;x,y&#xff09;&#xff0c;其中x表示学习特征&#xff0c;y表示输出&#xff0c;m表示输入总数&#xff0c;有监督学习旨在根据输入建立能够预测可能输出的模型&#xff0c;大致可以分为回归和分类两种&#xff0c;代表可能输出是无限的或…...

揭开 AI 绘画提示词的神秘密码!

前言 ** 揭秘AI 绘画 ** 提示词的神秘密码 亲爱的朋友们&#xff0c;今天我们要一起探索 AI 绘画世界中那神秘的“密码”——提示词。 在 AI 绘画的奇妙领域里&#xff0c;提示词就像是一把神奇的钥匙&#xff0c;能够开启无尽的创意之门。它是我们与 AI 进行心灵对话的桥…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...