Java9及之后关于类加载器的新特性

为了保证兼容性,JDK9没有从根本上改变三层类加载器的架构和双亲委派模型,但为了模块化系统的顺利运行,仍然发生了一些值得被注意的变动

一、变动1

由于引入了模块化概念,所以不同的类加载器回去加载属于不同模块的类

启动类加载器
在这里插入图片描述
平台类加载器
在这里插入图片描述
应用类加载器

在这里插入图片描述

二、变动二

扩展机制被移除,但是扩展类加载器由于向后兼容性的原因被保留,然后被重命名为平台类加载器Platform ClassLoader,可以通过ClassLoader的新增方法getPlatformClassLoader来获取。

原因: JDK9是基于模块化进行构建的,它将原来的rt.jar和tools.jar拆分成了很多的JMOD文件,文件中的Java类库已经天然地满足了可扩展的需求,所以扩展机制已经没有继续存在的价值了。

public class ClassLoaderTest {
    public static void main(String[] args) {
        System.out.println(ClassLoaderTest.class.getClassLoader());
        System.out.println(ClassLoaderTest.class.getClassLoader().getParent());
        System.out.println(ClassLoaderTest.class.getClassLoader().getParent().getParent());
    }
}

在这里插入图片描述

三、变动三

平台类加载器和应用程序类加载器都不再继承于java.net.URLClassLoader,而是继承于jdk.internal.loader.BuiltinClassLoader,并且连启动类加载器都是。

在这里插入图片描述

四、变动四

类加载器有了名称属性,该名称可以在构造方法中进行指定,通过getName方法来获取。应用类加载器的默认名称是app,平台类加载器的默认名称是platform。

五、变动五

启动类加载器现在是由JVM内部和Java类库共同协作实现的类加载器,但为了与之前代码进行兼容,在尝试获取启动类加载器时仍然会返回null,而不会得到对应的BootClassLoader实例。

六、变动六

类加载的委派关系发生了变动。

在这里插入图片描述

  • 对比
  • 在JDK9之前的版本中,当扩展及应用程序类加载器收到类加载请求,会委派给父加载器加载,只有当父加载器反馈自己无法完成这个加载请求时,才会由子类加载器尝试进行加载。
  • 在JDK9之后的版本中,当平台及应用程序类加载器收到类加载请求,在委派给父加载器加载前,要先判断该类是否能够归属到某一个系统模块中,如果可以找到这样的归属关系,就要优先委派给负责那个模块的加载器完成加载

七、测试代码

public class DemoApplication {
    public static void main(String[] args) {
        System.out.println(DemoApplication.class.getClassLoader());
        System.out.println(DemoApplication.class.getClassLoader().getParent());
        System.out.println(DemoApplication.class.getClassLoader().getParent().getParent());
        // 获取系统类加载器
        System.out.println(ClassLoader.getSystemClassLoader());
        // 获取平台类加载器
        System.out.println(ClassLoader.getPlatformClassLoader());
        // 获取类的加载器的名称
        System.out.println(DemoApplication.class.getClassLoader().getName());
        System.out.println(DemoApplication.class.getClassLoader().getParent().getName());
        ModuleLayer layer = ModuleLayer.boot();
        Set<Module> allModules = layer.modules();

//打印所有已加载模块及其对应的类加载器
        for (Module module : allModules) {
            ClassLoader classLoader = module.getClassLoader();
            ModuleDescriptor descriptor = module.getDescriptor();
            System.out.println("Module: " + descriptor.name() +
                    ", Class Loader: " + classLoader);
        }

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

打工人副业变现秘籍,某多/某手变现底层引擎-Stable Diffusion简介

Stable Diffusion是2022年发布的深度学习文本到图像生成模型,它主要用于根据文本的描述产生详细图像,尽管它也可以应用于其他任务,如

使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题

文章目录 一、 篇头二、 操作步骤2.1 编译AOSP AS工程文件2.2 将AOSP导入Android Studio2.3 切到Project试图2.4 等待index结束2.5 下载缺失的JDK 1.82.6 导入完成 三、 导入AS的好处3.1 本文案例演示源码编译错误AS对比同文件其余地方的调用AS错误提示依赖AS做错误修正 一、 篇…

字符串函数strtok

1.调用格式&#xff1a; 2.调用形式&#xff1a;char*strtok(char*p1,const char*p2),其中第二个是由分隔符组成的字符串&#xff0c;第一个为需要分隔的字符串 3.调用目的&#xff1a;将分隔符之间的字符串取出 4.调用时一般将源字符串拷贝后调用&#xff0c;因为此函数会将…

键盘打字盲打练习系列之循序渐进——4

一.欢迎来到我的酒馆 盲打&#xff0c;循序渐进&#xff01; 目录 一.欢迎来到我的酒馆二.继续练习二.矫正坐姿 二.继续练习 前面的章节&#xff0c;我们重点向大家介绍了主键盘区指法和键盘键位。经过一个系列的教程学习&#xff0c;相信大家对盲打这项技能已经掌握得差不多了…

金融量化交易:使用Python实现遗传算法

大家好&#xff0c;遗传算法是一种受自然选择过程启发的进化算法&#xff0c;用于寻找优化和搜索问题的近似解决方案。本文将使用Python来实现一个用于优化简单交易策略的遗传算法。 1.遗传算法简介 遗传算法是一类基于自然选择和遗传学原理的优化算法&#xff0c;其特别适用…

数据分析实例:基于电力大数据的中小型企业运营发展分析

前不久&#xff0c;帆软发起了【2023BI数据分析大赛】的活动&#xff0c;老李我也是这个大赛的评委。   今天跟大家分享的是基于电力大数据的中小型企业运营发展分析。 当我们去解读一份数据分析报告时&#xff0c;首先要了解这份报告的主要目的是什么&#xff0c;作者通过分…

mapbox使用v3版本,v2的样式切换不同时间段

创建DayAndNight.js /*** 使用方式* const dayNight new DayAndNight({ map: map // map 地图对象}) * 修改类型* dayNight.setConfigProperty(value)*/ class DayAndNight {constructor (sdMap) {this.map sdMap.mapthis.initStyle()}// 初始化时添加必要样式initStyle () {…

vue中设置滚动条的样式

在vue项目中&#xff0c;想要设置如下图中所示滚动条的样式&#xff0c;可以采用如下方式&#xff1a; ​// 直接写在vue.app文件中 ::-webkit-scrollbar {width: 3px;height: 3px; } ::-webkit-scrollbar-thumb { //滑块部分// border-radius: 5px;background-color: #1890ff;…

excel数据重复率怎么计算【保姆教程】

大家好&#xff0c;今天来聊聊excel数据重复率怎么计算&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; excel数据重复率怎么计算 在Excel中计算数据重复率可以通过以下步骤实现&#xff1a; 1. 确定重复…

Java并发编程-synchronized、volatile、AQS解析

Java并发编程 synchronized 如何保证线程安全 JDK1.6 之前&#xff0c;synchronized 是一个重量级锁相比于JUC的锁显得非常笨重&#xff0c;存在性能问题 JDK1.6 及之后&#xff0c;Java 对 synchronized 进行的了一系列优化&#xff0c;性能与 JUC 的锁不相上下 synchroni…

python源码,在线读取传奇列表,并解析为需要的JSON格式

python源码&#xff0c;在线读取传奇列表&#xff0c;并解析为需要的JSON格式 [Server] ; 使用“/”字符分开颜色&#xff0c;也可以不使用颜色&#xff0c;支持以前的旧格式&#xff0c;只有标题和服务器标题支持颜色 ; 标题/颜色代码(0-255)|服务器标题/颜色代码(0-255)|服务…

WPF使用WebBrowser页面白屏,不显示渲染页面问题排查

前言 WPF使用WebBrowser页面白屏&#xff0c;不显示渲染页面问题排查 代码 <Window x:Class"WpfApp1.Window5"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"x…

Kubernetes入门笔记 ——(3)理解pod对象

为什么需要pod 最为熟知的一句话&#xff1a;pod是k8s的最小调度单位。刚开始听到这句话时会想&#xff0c;已经有容器了&#xff0c;k8s为什么还要搞个pod出来&#xff1f;容器和pod是什么关系&#xff1f;容器的本质是进程&#xff0c;而k8s本质上类似操作系统。 熟悉Linux的…

在git使用SSH密钥进行github身份认证学习笔记

1.生成ssh密钥对 官网文档&#xff1a;Https://docs.github.com/zh/authentication&#xff08;本节内容对应的官方文档&#xff0c;不清晰的地方可参考此内容&#xff09; 首先&#xff0c;启动我们的git bush&#xff08;在桌面右键&#xff0c;点击 Git Bush Here &#xf…

SystemVerilog学习(0)——目录与传送门

一、验证导论 SystemVerilog学习&#xff08;1&#xff09;——验证导论-CSDN博客文章浏览阅读403次。SystemVerilog自学&#xff0c;验证系统概述&#xff0c;什么是SVhttps://blog.csdn.net/apple_53311083/article/details/133953016 二、数据类型 SystemVerilog学习&…

非标设计之气缸的选型三

一、气缸正确安装方式&#xff0c;气缸调试注意事项 气缸安装方式&#xff1a; 气缸正确安装方式&#xff1a; NB(无支架) FB(脚座支架) FR(法兰) FA(前法兰) FB(后法兰) SC(单耳支架) DC(双耳支架) CT(耳轴支架) 气缸的安装形式决定方法&#xff1a;根据负荷运动方向决定气缸…

二百一十二、Flume——Flume实时采集Linux中的目录文件写入到HDFS中(亲测、附截图)

一、目的 在实现Flume实时采集Linux中的Hive日志写入到HDFS后&#xff0c;再做一个测试&#xff0c;用Flume实时采集Linux中的目录文件&#xff0c;即使用 Flume 监听Linux整个目录的文件&#xff0c;并上传至 HDFS中 二、前期准备 &#xff08;一&#xff09;安装好Hadoop、…

微信个人号机器人开发

简要描述&#xff1a; 取消消息接收 请求URL&#xff1a; http://域名地址/cancelHttpCallbackUrl 请求方式&#xff1a; POST 请求头Headers&#xff1a; Authorization&#xff1a;login接口返回Content-Type&#xff1a;application/json 无参数 返回数据&#xff…

PADS9.5封装库转换为AD库

1、打开PADS Layout&#xff0c;File – Library&#xff0c;选中usr&#xff0c;如下图&#xff1a; 2、封装– 导入&#xff0c;选中你的 .d后缀文件(也就是PADS的封装文件)&#xff0c;打开。 3、元件 – 新建 – PCB封装 - 分配 - 确定。 4、&#xff0c;选择“斜线”…

vue3路由跳转页面到顶部,Stable Diffusion使用ControlNet

打开新页面时&#xff0c;页面自动回到顶部 在router.js页面添加 router.beforeEach((to, from, next) > {// 在每次导航之前滚动到页面顶部window.scrollTo({top: 0,behavior: smooth // 可选的&#xff0c;使滚动平滑进行});next(); }); Controlnet ControlNet 是用来…