类加载器与模块化系统

news2024/9/20 14:36:07

 1 类加载器

“类加载器”是实现应用程序自己决定如何去获取所需的类这个动作的代码。

1.1 类与类加载器

比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义。否则,即使这两个类来源同一个Class文件,被同一个Java虚拟机加载,只要加载它们的类加载器不同,那么这两个类就必定不相等。

1.2 双亲委派模型

JDK8及之前版本,绝大多数Java程序都会使用到以下3个系统提供的类加载器来进行加载。

启动(引导)类加载器

Bootstrap Class Loader

负责加载存放在<JAVA_HOME>\lib目录,或者被-Xbootclasspath参数所指定的路径中存放的,而且是Java虚拟机能够识别的。 如果需要把加载请求委派给启动类加载器去处理,那直接使用null代替即可。

扩展类加载器

Extension Class Loader

Java代码实现。负责加载<JAVA_HOME>\lib\ext目录中,或者被java.ext.dirs系统变量所指定的路径中所有的类库。

应用程序类加载器

Application Class Loader

Java代码实现,负责加载用户类路径(ClassPath)上所有的类库。如果应用程序中没有自定义过自己的类加载器,一般情况下这就是程序中默认的类加载器。

图 类加载器之间的协作关系

双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器。这里的父子关系一般不是以继承的关系来实现的,而是通常使用组合关系来复用父加载器的代码。

图 双亲委派模型工作过程

双亲委派模型一个显而易见的好处就是Java中的类随着它的类加载器一起具备了一种带有优先级的层次关系。

1.3 破坏双亲委派模型

直到Java模块化出现为止,双亲委派模型出现过3次较大规模“被破坏”的情况。

1.3.1 JDK1.2版本之前

双亲委派模型是在JDK1.2之后才被引入,而抽象类ClassLoader则在Java第一个版本就存在,用户在编写自定义类加载器时,可能会覆盖loadClass方法,从而破坏双亲委派机制。

图 用户自定义类加载器覆盖loadClass方法

解决措施是在Jdk1.2后,引入findClass方法,推荐用户自定义类加载器时重写这个方法而不是loadClass方法。

图 ClassLoader类中的loadClass方法

1.3.2 模型自身缺陷导致

双亲委派很好地解决了各个类加载器协作时基础类型的一致性问题(越基础的类由越上层的加载器进行加载)。但是,如果有基础类型需要调用用户代码的时候,这个模型将会被破坏。

比如连接数据库。JDK提供了一组规范和接口,各个不同数据库厂商按照这个接口去实现自己的类库。按照双亲委派模型,JDK的代码包中的加载使用的是启动类加载器,但是厂商自定义的类库,不可能使用启动类加载器加载。

数据库连接服务使用线程上下文类加载器去加载所需的厂商自定义代码。这是一种父类加载器去请求子类加载器完成类加载的行为。

1.3.3 用户对程序动态性的追求导致

框架在实现模块化热部署的关键是自定义类加载器机制的实现。而这些自定义类加载器的加载规则大部份不符合双亲委派模型。

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

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

相关文章

智慧型档案馆十防一体化安全管控平台所需要的主要产品

档案八防十防常用的十款设备 序号 名称 1 温湿度传感器 2 空气质量云测仪 3 恒湿净化一体机 4 健康防护一体机 5 综合智能触摸一体化区域控制器 6 空调红外学习控制模块 7 漏水检测控制器及感应线 8 数字烟雾传感器 9 红外防盗传感器 10 系统软件平台 附…

无脑006——mmrotate框架下复现RTMDet-R

必须用mmrotate才有hrsc的程序 1 安装环境&#xff1a; Linux RTX 3090 nvcc --version cuda 11.3 pytorch 1.11.0 conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatoolkit11.3 -c pytorch测试pytorch是否安装成功&#xff1a; >>> torch.…

深入浅出PyTorch数据读取机制

熟悉深度学习的小伙伴一定都知道&#xff1a;深度学习模型训练主要由数据、模型、损失函数、优化器以及迭代训练五个模块组成。如下图所示&#xff0c;Pytorch数据读取机制则是数据模块中的主要分支。 Pytorch数据读取是通过​​Dataset​​​​​Dataloader​​的方式完成。其…

SOME/IP中间件通信流程

本文根据文章《CAPL如何实现SOME/IP协议通信:SomeIP_IL.dll函数篇(超两万字详解)》内容,抽取总结出SOME/IP通信流程,正不正确的另说,目的是为了加深对SOME/IP中间件的理解。 首先,不管是消费方consumer,还是提供方provider,都有自己的someip中间件。本质上,它是一个…

vue3 cesium datav 可视化大屏

目录 0. 预览效果 1. 代码库包 2. 技术点 3. 一些注意事项&#xff08;配置参数&#xff09; 4. 相关代码详情 0. 预览效果 包含的功能&#xff1a; ① 地球按照一定速度自转 ② 修改加载的geojson面样式 ③ 添加 文字 标注&#xff01; 1. 代码库包 直接采用vue-cli5 创建…

MySql从入门到精通

MySql介绍 MySQL 是最流行的关系型数据库管理系统&#xff0c;在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System&#xff1a;关系数据库管理系统)应用软件之一。 什么是数据库 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储…

oracle 闪回恢复

oracle 闪回恢复 闪回恢复区主要通过3个初始化参数来设置和管理&#xff1a; db_recovery_file_dest&#xff1a;指定闪回恢复区的位置 db_recovery_file_dest_size&#xff1a;指定闪回恢复区的可用空间大小 db_flashback_retention_target&#xff1a;指定数据库可以回退的时…

年近30 ,无情被辞,想给划水的兄弟提个醒

前几天&#xff0c;一个认识了好几年在大厂工作的程序员朋友&#xff0c;年近30了&#xff0c;却被大厂以“人员优化”的名义无情被辞&#xff0c;据他说&#xff0c;有一个月散伙饭都吃了好几顿…… 在很多企业&#xff0c;都有KPI考核&#xff0c;然后在此基础上还会弄个“末…

讲的太好了!!!————————Idea中的VM Options、Program Arguments、Environment Variable全解析

参数使用方式示例代码获取方式VM Options必须以 -D 、 -X 、 -XX 开头&#xff0c;每个参数用空格隔开 &#xff0c;使用最多的就是 -Dkeyvalue-Dvm.keyVmKey -Dvm.key2VmKey2String key System.getProperty(“vm.key”); Program Arguments为我们传入main方法的字符串数组arg…

10-03 单元化架构设计

设计原则 透明 对开发者透明 在做实现时&#xff0c;不依赖于单元划分和部署对组件透明 在组件运行时&#xff0c;不感知其承载单元对数据透明 数据库并不知道为哪个单元提供服务 业务可分片 系统业务复杂度足够高系统可以按照某一维度进行切分系统数据必须可以被区分 业务…

【网络】交换机基本原理与配置

目录 &#x1f341;交换机工作原理 &#x1f341;交换机接口的双工模式 &#x1f341;交换机命令行模式 &#x1f341;交换机常见命令 &#x1f9e7;帮助命令 &#x1f9e7;常用命令介绍 &#x1f341;交换机的基本配置 &#x1f9e7;配置接口的双工模式及速率 &#x1f990;博…

knife4j生产环境资源屏蔽

问题描述 knife4j是目前比较主流的自动API文档生成工具&#xff0c;在生产环境使用的过程中&#xff0c;我们一般会屏蔽或者去除Swagger的文档口径&#xff0c;防止接口信息泄露&#xff0c;保证系统安全。 但是最近在开发过程中使用knife4j-spring-boot-starter 3.0.2过程中&…

dolphinscheduler使用impala shell执行sql

目录 一、背景 二、方法 1.impala shell -f 文件名 2.impala shell -q sql 一、背景 因为dolphinscheduler工具sql组件不支持impala数据源&#xff0c;只能折衷方法通过shell来执行impala sql。 二、方法 1.impala shell -f 文件名 操作步骤&#xff1a; 1).【资源中心】…

受邀参加【第七届】中国客户服务节

在AI浪潮的推动下&#xff0c;客户服务“智能化”是企业高质量发展的重要途径之一&#xff0c;目前人工智能、大数据、云计算等技术已广泛应用于全行业的客户服务场景中&#xff0c;一个全面、完善、稳定的智能通讯服务平台可助力实现企业智能化应用转型和升级。 讯鸿网络作为国…

嘉立创EDA原理图封装画错了怎么办

摘要&#xff1a;本文以贴片电阻封装由1206修改为0805为例&#xff0c;介绍一下封装修改的一种方法。 1.问题描述 设计原理图的时候&#xff0c;误将封装设计成为1206了&#xff0c;现在想把它改为0805封装。 2.修改封装的步骤 首先在原理图中&#xff0c;修改对应的电阻器件…

Flutter 3.10 适配之单例 Window 弃用,一起来了解 View.of 和 PlatformDispatcher

Flutter 3.10 发布之后&#xff0c;大家可能注意到&#xff0c;在它的 release note 里提了一句&#xff1a; Window singleton 相关将被弃用&#xff0c;并且这个改动是为了支持未来多窗口的相关实现。 所以这是一个为了支持多窗口的相关改进&#xff0c;多窗口更多是在 PC 场…

统计学习方法:序贯概率比检验SPRT

Sequential Probability Ratio Test 应用&#xff1a;制造过程中的质量控制和医学试验中的异常检测 1.theory/principal 区别(vs固定样本检验)&#xff1a;在固定样本检验中&#xff0c;一定数量的观察结果被用来从两个或多个备选方案中选择一个假设。而SPRT则是一次检查一个…

AI“应用商店”来了!OpenAI首批70个ChatGPT Plugin最全梳理

OpenAI放出大招&#xff0c;本周将向所有ChatGPT Plus用户开放联网功能和众多插件本周将向所有ChatGPT Plus用户开放联网功能和众多插件&#xff0c;允许ChatGPT访问互联网并使用70个第三方插件。 本批第三方插件能够全方位覆盖衣食住行、社交、工作以及学习等日常所需&#x…

Electron自定义窗口

Electron标题栏隐藏和自定义 Electron应用自定义标题栏样式 标题栏样式允许隐藏浏览器窗口的大部分色彩&#xff0c;同时保持系统原生窗口控件完整无损&#xff0c;并可以在 BrowserWindow 的构造器中使用 titleBarStyle 选项来配置。 应用 hidden 标题栏样式的结果是隐藏标…

无线充+台灯专用PD诱骗芯片LDR6328S

近几年&#xff0c;日常生活中到处可以看到消费者使用支持Type-c接口的电子产品&#xff0c;如手机&#xff0c;笔记本&#xff0c;筋膜枪&#xff0c;蓝牙音箱等等。例如&#xff0c;像筋膜枪&#xff0c;蓝牙音箱&#xff0c;无人机&#xff0c;小风扇。 无线充台灯方案&…