tomcat与自定义类加载器

news2024/9/20 3:22:15

类加载器与类的”相同“判断

类加载器除了用于加载类外,还可用于确定类在Java虚拟机中的唯一性。
不同类加载器加载的类在 JVM 看来是两个不同的类,因为在 JVM 中一个类的唯一标识是 类加载器+类名(包括包名)。

类加载器种类

启动类加载器,Bootstrap ClassLoader,加载JAVA_HOME\lib,或者被-Xbootclasspath参数限定的类
扩展类加载器,Extension ClassLoader,加载\lib\ext,或者被java.ext.dirs系统变量指定的类
应用程序类加载器,Application ClassLoader,加载ClassPath中的类库
自定义类加载器,通过继承ClassLoader实现,一般是加载我们的自定义类
在这里插入图片描述

双亲委派的关键源代码

JVM 在触发类加载时调用的是 ClassLoader.loadClass 方法。这个方法的实现了双亲委派:先检查指定类(应该仅是包名+类名,不包括类加载器)是否已经被加载过;
若否则递归调用父类加载器的loadClass()方法查询,(父类非指继承,而是指组合的parent变量);
若递归调用失败,就调用本ClassLoader的findClass()进行加载。

我:简单来说,若不想破坏双亲委派,则不要改loadClass()方法,只能改findClass()。

JAVA热部署

首先谈一下何为热部署(hotswap),热部署是在不重启 Java 虚拟机的前提下,能自动侦测到 class 文件的变化,更新运行时 class 的行为。
一种实现的方法是创建自己的 classloader 来加载需要监听的 class,这样就能控制类加载的时机,从而实现热部署:

1、销毁自定义classloader(被该加载器加载的class也会自动卸载);

2、更新class

3、使用新的ClassLoader去加载class

Tomcat独特的类加载机制1,2

tomcat为什么要使用自定义类加载器?

在这里插入图片描述
一个tomcat中可以部署多个应用,而每个应用中都存在很多类,并且各个应用中的类是独立的,全类名是可以相同的,比如一个博客系统中可能存在com.data.User类,一个库存系统中可能也存在com.data.User类。
一个tomcat,不管内部部署了多少应用,Tomcat启动之后就是一个Java进程,也就是一个JVM,所以如果Tomcat中只存在一个类加载器,比如默认的AppClassLoader,那么就只能加载一com.data.User类,这是有问题的 .

Tomcat如何实现自己独特的类加载机制?

Tomcat有多种类加载器。其中WebApp类加载器和Jsp类加载器通常会存在多个实例,每一个Web应用程序对应一个WebApp类加载器,每一个JSP文件对应一个Jsp类加载器:
WebappClassLoader是各个Webapp私有的类加载器,加载路径中的class只对当前Webapp可见。WebAppClassLoader可以使用SharedClassLoader加载到的类,但各个WebAppClassLoader实例之间相互隔离。
而JasperLoader的加载范围仅仅是这个JSP文件所编译出来的那一个.Class文件,它出现的目的就是为了被丢弃:当Web容器检测到JSP文件被修改时,会替换掉目前的JasperLoader的实例,并通过再建立一个新的Jsp类加载器来实现JSP文件的HotSwap功能。

附:

一些其他参考文章:
Java 类加载机制(阿里)-何时初始化类
知乎----如何实现Java类隔离加载?


  1. 头条:在tomcat中,为什么要使用自定义类加载器? ↩︎

  2. 深入理解 Tomcat(四)Tomcat 类加载器之为何违背双亲委派模型 ↩︎

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

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

相关文章

phpstorm左边变黄,页面内跳转追踪等功能不好使了

第一种方法:删除项目根目录中.idea文件夹(确保删除成功),然后再重新打开项目即可(这个方法对我无效) 第二种方法:点击File(文件)->Repair IDE(修复IDE),按照右下角的指示一步步操作即可(这种…

华为OD机试真题 Python 实现【静态代码扫描服务】【2023Q1 100分】

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Python算法源码六、效果展示1、输入2、输出 一、题目描述 静态扫描快速识别源代码的缺陷,静态扫描的结果以扫描报告作为输出: 文件扫描的成本和文件大小相关,如果文件大小为N&am…

echarts折线图背景空白太大

1、没有调间距的效果: 2、更改间距后的效果: 3、其实只要更改grid定位值就行了,上代码: grid: {top: 20px,left: 20px,right: 20px,bottom: 20px,containLabel: true},4、将代码copy到option里面就行了

【中间件】Ngnix入门

文章目录 下载地址相关概念*反向代理:*负载均衡:轮询权重轮询iphash*动静分离 文件解释/conf/nginx.conf 基本使用双击运行(不建议)使用命令行 常用命令(Linux下) 下载地址 Nginx官网下载页 相关概念 *反…

IMX8QXP SPI CS片选连续传输模式

问题背景 在开发项目中,换了一个spi安全芯片,发现不能进行通信,查看spi信号波形,时钟,发送数据,片选都是正常的,但没有回复数据。安全芯片技术正常通过查看CS片选波形信号,提出CS片选…

Appium: Windows系统桌面应用自动化测试(一)

Appium: Windows系统桌面应用自动化测试 一、方案调研二、环境搭建1、WinAppDriver环境搭建(1)开启开发者选项中的“开发人员模式”(2)windows sdk下载安装(3)WinAppDriver下载安装 2、appium环境搭建&…

2018年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——纯享题目版

🏠个人主页:fo安方的博客✨ 💂个人简历:大家好,我是fo安方,考取过HCIE Cloud Computing、CCIE Security、CISP等证书。🐳 💕兴趣爱好:b站天天刷,题目常常看&a…

第十二章 原理篇:vision transformer

参考教程: https://arxiv.org/pdf/2010.11929.pdf https://zhuanlan.zhihu.com/p/340149804 【大佬总结的非常好,他的好多篇文章都很值得学习】 文章目录 为什么会使用transformerVIT详解method获得patchpatch embeddingposition embedding 代码实现eino…

数据结构--队列的顺序实现

数据结构–队列的顺序实现 队列的顺序存储代码定义 #define MaxSize 10 //定义队列中元素最大个数 typedef struct {ElemType data[MaxSize]; //静态数组存放队列元素int front, rear; //对头指针 & 队尾指针 } SqQueue; 初始化操作 void InitQueue(SqQueue &Q) {Q.r…

第九十三天学习记录:C++核心:类和对象Ⅱ(五星重要)

对象的初始化和清理 构造函数和析构函数 对象的初始化和清理也是两个非常重要的安全问题 一个对象或者变量没有初始化状态,对其使用后果是未知 同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题 c利用了构造函数和析构函数…

搜索封装+crud+重点细节优化

新建GSearchQuery.vue <template> <el-row :span"24><el-input type"text" v-model"query"></el-input><slot></slot> </el-row> </template>data() {return{query: }}index.vue 引入组件 <GSe…

每周学点数学 1:数学建模计划篇

用GPT3.5生成了一段数学建模学习的计划&#xff0c;我准备在视觉学习的同时&#xff0c;穿插一些数学理论方面的学习&#xff0c;以下是近三个月的计划。 7月2日-7月8日&#xff1a;了解数学建模的基本概念和方法&#xff0c;阅读相关教材和论文&#xff0c;了解数学建模的应…

【如何用大语言模型快速深度学习系列】开篇+文本匹配系列

开篇 很久没有更新啦&#xff01;这个系列其实是自己的一个学习笔记啦&#xff01;这个系列的特色就是我们不再通过看视频的方式入门深度学习。 开篇的时候&#xff08;2023.07.01&#xff09;&#xff0c;我想的是围绕自然语言处理的一些基础方法&#xff08;代码方面&#…

带你用Python制作一个经典小游戏:扫雷

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 游戏界面尺寸 方块尺寸 雷的数量 游戏状态 最后&#xff0c;我们定义一个函数run()&#xff…

软件项目成本的计算

在《架构思维的六要素》中&#xff0c;列出的第一个要素就是成本&#xff0c;成本对项目设计和决策起着至关重要的作用。今天咱们就来看看直接成本、间接成本和总成本的关系。 直接成本 工作于服务的开发者工作于系统测试的测试者设计数据库的DBA设计界面和致力于优化用户体验的…

ROS学习篇之远程控制(七)-局域网内的控制

文章目录 一.pc与pc端二.手机与pc端&#xff08;1&#xff09;pc端&#xff1a;**步骤1&#xff1a;** 运行 roscore**步骤2&#xff1a;** 新开一个终端运行&#xff0c;运行 rosrun turtlesim turtlesim_node **步骤3&#xff1a;** 新建一个终端查看ip&#xff0c;运行ifcon…

基于matlab根据特征进行全景图像拼接(附源码)

一、前言 此示例演示如何使用基于特征的图像配准技术自动创建全景图。 特征检测和匹配是许多计算机视觉应用&#xff08;如图像配准、跟踪和对象检测&#xff09;中使用的强大技术。在此示例中&#xff0c;基于特征的技术用于自动拼接一组图像。图像拼接过程是基于特征的图像…

火车头采集:高效数据采集工具的介绍

火车头采集是一款基于Python语言开发的网络爬虫工具&#xff0c;用于快速高效地从互联网上采集数据并存储到本地或远程数据库。它简单易用且功能强大&#xff0c;在各行各业广泛应用。 1、设置chatgpt自定义key 添加网站 通过关键词批量生成原创文章 设置发布网站 发布成功 相…

Python GUI编程利器:Tkinker中的文本输入框和下拉菜单(4)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日目标 实现下面效果&#xff1a; 文本输入框(Entry类) 文本输入框&#xff0c;顾名思义&#xff0c;就是实现文本输入功能…

dnsServer搭建

一、dokcer安装 #下载文件&#xff1a;https://github.com/TechnitiumSoftware/DnsServer/blob/master/docker-compose.yml #另存到/root/docker-compose.yml cd /root docker-compose -f docker-compose.yml up -d #启动成功后&#xff0c;浏览器输入&#xff1a;http://192…