Java:简述类的加载机制-双亲委派

news2024/9/21 20:38:26

类加载的机制过程分为以下:加载、验证、准备、解析、初始化等。

在第一步的加载环节,Java类加载器有四种:Bootstrap类加载器、Extention 类加载器、Application类加载器、Custom自定义类加载器,其中会涉及“双亲委派”模式。

一、双亲委派的概念

双亲委派模式是在Java 1.2后引入的,其工作原理的是,如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。
在这里插入图片描述

二、双亲委派的好处

1、每一个类都只会被加载一次,避免了重复加载。
2、每一个类都会被尽可能的加载(从引导类加载器往下,每个加载器都可能会根据优先次序尝试加载它)。
3、有效避免了某些恶意类的加载(比如自定义了Java.lang.Object类,一般而言在双亲委派模型下会加载系统的Object类而不是自定义的Object类)。

三、如何破坏双亲委派模型

1、双亲委派模型的第一次“被破坏”是重写自定义加载器的loadClass(),jdk不推荐。一般都只是重写findClass(),这样可以保持双亲委派机制。而loadClass方法加载规则由自己定义,就可以随心所欲的加载类。

2、双亲委派模型的第二次“被破坏”是ServiceLoader和Thread.setContextClassLoader()。即线程上下文类加载器(contextClassLoader)。双亲委派模型很好地解决了各个类加载器的基础类统一问题(越基础的类由越上层的加载器进行加载),基础类之所以被称为“基础”,是因为它们总是作为被调用代码调用的API。但是,如果基础类又要调用用户的代码,那该怎么办呢?线程上下文类加载器就出现了。

  • SPI。这个类加载器可以通过java.lang.Thread类的setContextClassLoader()方法进行设置,如果创建线程时还未设置,它将会从父线程中继承一个;如果在应用程序的全局范围内都没有设置过,那么这个类加载器默认就是应用程序类加载器。有了线程上下文类加载器,JNDI服务使用这个线程上下文类加载器去加载所需要的SPI代码,也就是父类加载器请求子类加载器去完成类加载动作,这种行为实际上就是打通了双亲委派模型的层次结构来逆向使用类加载器,已经违背了双亲委派模型,但这也是无可奈何的事情。Java中所有涉及SPI的加载动作基本上都采用这种方式,例如JNDI、JDBC、JCE、JAXB和JBI等。
  • 线程上下文类加载器:默认情况下就是AppClassLoader,那为什么不直接通过getSystemClassLoader()获取类加载器来加载classpath路径下的类的呢?其实是可行的,但这种直接使用getSystemClassLoader()方法获取AppClassLoader加载类有一个缺点,那就是代码部署到不同服务时会出现问题,如把代码部署到Java Web应用服务或者EJB之类的服务将会出问题,因为这些服务使用的线程上下文类加载器并非AppClassLoader,而是Java Web应用服自家的类加载器,类加载器不同。,所以我们应用该少用getSystemClassLoader()。总之不同的服务使用的可能默认ClassLoader是不同的,但使用线程上下文类加载器总能获取到与当前程序执行相同的ClassLoader,从而避免不必要的问题。

3、双亲委派模型的第三次“被破坏”是由于用户对程序动态性的追求导致的,这里所说的“动态性”指的是当前一些非常“热门”的名词:代码热替换、模块热部署等,简答的说就是机器不用重启,只要部署上就能用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2085259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 安装Mysql保姆级教程

一、检查环境 我们登录服务器,查看之前是否安装过mysql rpm -qa | grep mysql 由于我之前安装过,所以这里是有数据的 如果需要删除重新下载,可以使用 rpm -e mysql57-community-release-el7-10.noarch.rpm 二、安装 1、下载 接下来下载安装包 wget -i -c http:/…

CAM Back Again论文详解

论文名称:Large Kernel CNNs from a Weakly Supervised ObjectLocalization Perspective 论文地址:[2403.06676] CAM Back Again: Large Kernel CNNs from a Weakly Supervised Object Localization Perspective (arxiv.org) 出发点 据报道&#xff0c…

通配符证书的简介和申请方法

通配符证书是一种SSL证书,它利用域名字段中的通配符(*)来指示,允许用户在一个证书中关联多个顶级域名及其子域,从而简化证书管理流程,节省成本和时间。以下是通配符证书的简介和申请方法的详细说明&#xf…

微信小程序开发--详情【开发一次 多端覆盖】

目录 1、准备工作 了解 uni-app : 准备开发工具: 下载 : 安装完成后,打开这个开发者工具: 对微信小程序进行配置: 使用开发工具HBuilderX:: 先安装终端插件 2、初始化一个demo 创建项目&#xff1…

分类预测|基于麻雀优化核极限学习机的数据分类预测Matlab程序SSA-KELM 多特征输入多类别输出 含基础KELM

分类预测|基于麻雀优化核极限学习机的数据分类预测Matlab程序SSA-KELM 多特征输入多类别输出 含基础KELM 文章目录 前言分类预测|基于麻雀优化核极限学习机的数据分类预测Matlab程序SSA-KELM 多特征输入多类别输出 含基础KELM 一、SSA-KELM模型SSA-KELM 分类预测的详细原理和流…

软考 -- 软件设计师 -- 二轮复习(1) -- 计算机系统基础知识错题集和重点知识(持续更新)

软考 – 软件设计师 – 二轮复习(1) – 计算机系统基础知识错题集和重点知识(持续更新) 文章目录 软考 -- 软件设计师 -- 二轮复习(1) -- 计算机系统基础知识错题集和重点知识(持续更新)前言一、CPU二、内存编址计算三、原码、反码、补码、移码计算四、浮点数 前言 考试时间&a…

led台灯对眼睛好不好?护眼台灯怎么选对眼睛好?收下这份攻略

随着年级的升高与学业内容的日益丰富,学生们待在书桌前的时间却越来越长。同时电子产品的广泛普及,让我国青少年的用眼负担显著增加。权威机构预测,到2050年,全球近视人群将达到惊人的49.49亿人,患病率高达52%。这一严…

MySQL编译安装

1.源码包地址 2.编译/安装 3.设置环境变量 4.初始化/登录 地址: MYSQL源码包下载 右键复制链接 使用wget 下载到/usr/local/src下 再使用rpm –ivh 安装 --这个时候跳转到 cd /root/rpmbuild/SOURCES 使用ll查看有什么东西 yum -y install gcc gcc-c ncurses ncurses-d…

java设计模式day01--(类之间的关系、软件设计原则、单例设计模式)

视频网址:s1.设计模式-课程介绍_哔哩哔哩_bilibili 1,设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中。 1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构…

Apache RocketMQ 批处理模型演进之路

作者:谷乂 RocketMQ 的目标,是致力于打造一个消息、事件、流一体的超融合处理平台。这意味着它需要满足各个场景下各式各样的要求,而批量处理则是流计算领域对于极致吞吐量要求的经典解法,这当然也意味着 RocketMQ 也有一套属于自…

ImportError: DLL load failed while importing _wrapper: 找不到指定的模块

今天使用pyinstaller打包好脚本,执行打包好的程序后,出现如下的报错: 这个问题花了我一个上午,在网上查找相关的解决方法,然而不知道是我的搜索方式有问题,还是这个资料比较少,找了很久,只找到了一篇极度相关的文章:https://blog.csdn.net/weixin_46457351/article/d…

C Primer Plus第十五章编程练习,仅供参考

第十五章编程练习 本章第一个编程练习的内容是让我们将二进制字符串转换为一个数值&#xff0c;传递字符串指针&#xff0c;逻辑并不复杂&#xff0c;完整程序代码以及运行结果如下&#xff1a; #include<stdio.h> #include<string.h> #include<math.h> in…

从C向C++28——设计模式

一.设计模式 1.设计模式理解 ​ C程序设计模式是针对在C编程中常见问题的通用、可重用的解决方案。设计模式主要是在软件工程领域&#xff0c;特别是在面向对象编程中发展起来的&#xff0c;它们提供了一种标准的术语和解决方案&#xff0c;可以帮助程序员更好地设计软件架构…

豆包 MarsCode试用体验

1.前言 豆包 MarsCode 是一款为你提供了AI编程助手和云端集成开发环境来协助你完成编程任务的产品。 2.功能介绍 2.1.豆包 MarsCode 编程助手 豆包 MarsCode 编程助手是豆包旗下的 AI 编程助手&#xff0c;提供以智能代码补全为代表的 AI 功能。它支持主流的编程语言和 IDE…

Luma AI,让你的视频像电影一样精彩!附带使用教程

Luma 视频生成 API 对接说明 随着 AI 的应用变广&#xff0c;各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多&#xff0c;从最初的写作&#xff0c;到医疗教育&#xff0c;再到现在的视频。 Luma 是一个专业高质量的视频生成平…

tomcat实验

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;Tomcat 具有处理HTML页面的功能&#xff0c;它还是一个Servlet和JSP容器。 下载文件 安装javajdk 解压 …

ComfyUI基础操作教学!小白入门必看!

在我们打开comfyui后会面对一堆节点&#xff0c;那么这些节点都是什么意思呢&#xff1f;今天跟着小元老师来学习一下吧&#xff5e; 一、拆解文生图基本工作流 这个是Comfyui默认的文生图工作流它的基本逻辑是&#xff1a; 条件输入板块——潜空间——像素空间 01 条件输入模…

AiThinkerIDE_V1.5.2工程随意移动地方,路径不能有空格

路径不能有空格&#xff0c;例如usr_sdk不能改为usr sdk IDF_PATH&#xff1a; ${workspace_loc:/AiThinkerProjectForESP}${workspace_loc:/AiThinkerProjectForESP}/examples/get-started/hello_world

2024年入职_转行网络安全,该如何规划呢?

前言 前段时间&#xff0c;知名机构麦可思研究院发布了 《2023年中国本科生就业报告》&#xff0c;其中详细列出近五年的本科绿牌专业&#xff0c;其中&#xff0c;信息安全位列第一。 网络安全前景 对于网络安全的发展与就业前景&#xff0c;想必无需我多言&#xff0c;作为…

C#中的批量引用已有的NuGet包

引言 小伙伴们有没有遇到过一个问题&#xff0c;就是我有一个类库A引用了很多NuGet包&#xff0c;但是到B类库中也需要使用&#xff0c;但是不想一个一个引用&#xff0c;很麻烦&#xff0c;所以我教大家一招&#xff0c;直接复制NuGet包&#xff1a; 第一步&#xff1a; 找…