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

【JVM】JVM基础教程(二)

上一篇:【JVM】JVM基础教程(一)-CSDN博客

类加载器

什么是类加载器(ClassLoader)

是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。

从这个定义可以得出结论:Java是允许开发者写点代码获取字节码信息的

类加载器只参与加载过程中的字节码获取并加载到内存这一部分

类加载的应用场景

类加载器的分类

类加载器分为两类

  • 一类是Java代码中实现的
  • 一类是Java虚拟机底层源码实现的

下图中

左边的属于第二类,我们Java开发者一般不用过多关注,这种类加载器保证我们程序运行时候的基础类调用的可靠性

右边的属于第一类,我们Java开发者要重点关注,这些类加载器继承自ClassLoader

类加载器的设计JDK8与8+的版本差别很大,9开始出现了模块化,所以8到9是一个分水岭

JDK8及以前的版本中默认的类加载器有如下几种:

不过学习编程一定要养成质疑的好习惯,真的只有三种类加载器吗?可以用Arthas查看一下

Arthas中类加载器相关的功能

类加载器的详细信息可以通过classloader命令查看:

classloader - 查看 classloader 的继承树,urls,类加载信息,使用 classloader 去 getResource

按类加载类型查看统计信息

发现Bootstrap加载器加载了3633个核心类

Application加载器加载了4个自定义类或者第三方类

似乎并没有上图的Extension加载器,这个加载器是用来加载通用类的

这个原因应该是由于图中使用的JDK版本是Oracle的,而我使用的是Adoptium Eclipse Temurin的

命名不同,源码不同

启动类加载器

启动类加载器(BootstrapClassLoader)是由Hotspot虚拟 机提供的、使用C++编写的类加载器

默认加载Java安装目录/jre/lib下的类文件,比如rt.jar, tools.jar,resources.jar等

下图是Oracle OpenJDK的

这个图是Adoptium Eclipse Temurin的

看的出来还是有很多区别的

加载自定义jar包

有两种方式

  • 放入jre/lib下进行扩展

不推荐,尽可能不要去更改JDK安装目录中的内容,会出 现即使放进去由于文件名不匹配的问题也不会正常地被加 载

  • 使用参数进行扩展

推荐,使用-Xbootclasspath/a:jar包目录/jar包名 进行扩 展

java -Xbootclasspath/a:/path/to/jar/my-library.jar -jar your-application.jar

Java中的默认类加载器

  • 扩展类加载器和应用程序类加载器都是JDK中提供的,使用Java编写的类加载器
  • 它们的源码都位于sun.misc.Launcher中,是一个静态内部类。继承自URLClassLoader。具备通过目录 或者指定jar包将字节码文件加载到内存中

扩展类加载器

扩展类加载器(Extension Class Loader)是JDK中提供的、 使用Java编写的类加载器

默认加载Java安装目录/jre/lib/ext下的类文件。

加载自定义jar包
  • 放入/jre/lib/ext下进行扩展

不推荐,尽可能不要去更改JDK安装目录中的内容

  • 使用参数进行扩展

推荐,使用-Djava.ext.dirs=jar包目录 进行扩展,这种方 式会覆盖掉原始目录,

可以用;(windows):(macos/linux) 追加上原始目录

java -Djava.ext.dirs=C:\path\to\jar;C:\Program Files\Java\jdk1.8.0_xx\jre\lib\ext -jar your-application.jar


双亲委派机制(重点)

我的理解:

        在 Java 的类加载机制中,父类加载器无法加载某个类的情况通常是因为 双亲委派模型 的约束。根据 Java 类加载的双亲委派机制,当父类加载器无法加载某个类时,才会将加载任务委派给子类加载器。换句话说,子类加载器只有在父类加载器尝试加载失败后才会介入。

每个由Java实现的类加载器中保存了一个成员变量叫 "父" (Parent)类加载器,并不是继承关系,可以理解为它的上级

  • 应用程序类加载器的parent父类加载器是扩展类加载器
  • 扩展类加载器的parent父类加载器是null,空的
  • 启动类加载器使用C++编写,没有上级类加载器
  • 在类加载的过程中,每个类加载器都会首先检查是否已经加载了该类,如果已经加载了则直接返回,否则会将加载请求委派给父类加载器

  • 如果类加载的parent为null,则会提交给启动类加载器处理

  • 如果所有的父类加载器都无法加载该类,则由当前类加载器自己尝试加载。所以看上去是自顶向下的顺序尝试加载

不过一般什么情况下,连parent父类加载器都无法加载呢?

比如:

1.类不存在于父类加载器的加载路径中

类加载器通常会根据类的路径(如文件系统路径、JAR 包等)来加载类。如果类文件不在父类加载器的路径中,父类加载器就无法加载该类。此时,父类加载器会把加载请求交给子类加载器。

  • 示例:假设父类加载器负责加载 Java 标准库中的类,而应用程序类(如自定义的类)则由应用类加载器来加载。
  • 路径问题:如果你尝试加载的类 MyClass 是应用程序的自定义类,而不是 Java 标准库类,父类加载器(系统类加载器)将无法在其默认路径中找到该类,它会将加载请求交给子加载器(比如应用程序的类加载器)去加载。

2.类加载器的职责范围不同

双亲委派模型 中,类加载器有不同的职责范围。例如:

  • 启动类加载器(Bootstrap ClassLoader) 主要加载 Java 标准库中的核心类(如 java.lang.*)。
  • 扩展类加载器(Extension ClassLoader) 加载 JDK 扩展目录中的类。
  • 系统类加载器(System ClassLoader) 或应用类加载器,主要负责加载应用程序代码。

这些类加载器的职责范围是不同的,如果一个类属于某个类加载器的职责范围外,父加载器就无法加载该类,并会将加载请求交给下一级加载器。例如,系统类加载器无法加载核心类库中的类,因为这些类是由启动类加载器加载的。

还有很多情况,我大致总结了一下

3. 父类加载器被显式禁止加载某些类

4. 类加载器的命名空间冲突

5. 父类加载器加载失败或发生异常

6. 自定义类加载器的特性

7. 动态代理与反射生成的类可能无法加载

  • 第二次再去加载相同的类,仍然会向上进行委派,如果某个类加载器加载过就会直接返回

再看一个案例:

先自下而上查找每个加载器的加载目录

发现都没加载过,那么开始自上而下挨个尝试加载,若最上面的不能加载,就向下挨个尝试

双亲委派机制的作用(重点)

  • 保证类加载的安全性

通过双亲委派机制,让顶层的类加载器去加载核心类,避免恶意代码替换JDK中的核心类库,比如java.lang.String,确保核心类库的完整性和安全性

  • 避免重复加载

双亲委派机制可以避免同一个类被多次加载,上层的类加载器如果加载过类,就会直接返回,避免重复加载

Arthas中类加载器相关的功能

类加载器的继承关系可以通过classloader -t查看

解决三个问题


上文说过,Java允许开发者用Java代码调用类加载器,

那么如何使用代码主动加载一个类呢?

方式1:使用Class.forName()方法,使用当前类的类加载器去加载指定的类

public class MyTest {public static void main(String[] args) throws Exception{// 动态加载类Class<?> aClass = Class.forName("com.autismbtkrsr.demo21.MyTest");// 创建实例aClass.getDeclaredConstructor().newInstance();System.out.println("加载类:" + aClass.getName());}
}

方法2:获取到类加载器,通过类加载器的loadClass方法指定某个类加载器进行加载

public class MyTest {public static void main(String[] args) throws Exception{// 获取main方法所在类的类加载器,应用程序类加载器Class<MyTest> aClass = MyTest.class;ClassLoader classLoader = aClass.getClassLoader();// 使用程序类加载器加载 com.autismbtkrsr.demo21.MyTestClass<?> aClass1 = classLoader.loadClass("com.autismbtkrsr.demo21.MyTest");System.out.println(aClass1.getClassLoader());System.out.println("加载类:" + aClass1.getName());}
}


打破双亲委派机制(重点)

三种方式

打破双亲委派机制的三种方式

自定义类加载器
  • 一个Tomcat程序中是可以运行多个Web应用的,如果这两个应用中出现了相同限定名的类,比如Servlet类, Tomcat要保证这两个类都能加载并且它们应该是不同的类。
  • 如果不打破双亲委派机制,当应用类加载器加载Web应用1中的MyServlet之后,Web应用2中相同限定名的 MyServlet类就无法被加载了

  • Tomcat使用了自定义类加载器来实现应用之间类的隔离。 每一个应用会有一个独立的类加载器加载对应的类。

  • 先来分析ClassLoader的原理,ClassLoader中包含了4个核心方法。
  • 双亲委派机制的核心代码就位于loadClass方法中。

  • 阅读双亲委派机制的核心代码,分析如何通过自定义的类加载器打破双亲委派机制。
  • 打破双亲委派机制的核心就是将下边这一段代码重新实现。

自定义加载器的默认父类加载器
  • 以JDK8为例,ClassLoader类中提供了构造方法设置parent的内容

  • 这个构造方法由另一个构造方法调用,其中父类加载器由getSystemClassLoader方法设置,该方法返回的是AppClassLoader

实现自定义加载器
  • 正确的实现一个自定义加载器的方法是重写findClass方法,这样不会破坏双亲委派机制

JDBC案例
  • JDBC中使用了DriverManager来管理项目中引入的不同数据库的驱动,比如MySQL驱动,Oracle驱动

  • DriverManager类位于rt.jar包中,由启动类加载器加载。

  • 依赖中的mysql驱动对应的类,由应用程序类加载器来加载

  • DriverManager属于rt.jar是启动类加载器加载的,而用户jar包中的驱动需要由应用类加载器加载,这就违反了双亲委派机制

SPI机制

  • DriverManage使用SPI机制,最终加载jar包中对应的驱动类。

  • SPI中使用了线程上下文中保存的类加载器进行类的加载,这个类加载器一般是应用程序类加载器。

1、启动类加载器加载DriverManager。

2、在初始化DriverManager时,通过SPI机制加载jar包中的myql驱动

3、SPI中利用了线程上下文类加载器(应用程序类加载器)去加载类并创建对象。

这个案例真的打破了机制吗?

似乎有争议?

OSGi模块化
  • 历史上,OSGi模块化框架。它存在同级之间的类加载器的委托加载。OSGi还使用类加载器实现了热部署的 功能。
  • 历史上,OSGi模块化框架。它存在同级之间的类加载器的委托加载。OSGi还使用类加载器实现了热部署的 功能。

JDK9之后的类加载器

下一章:

相关文章:

【JVM】JVM基础教程(二)

上一篇&#xff1a;【JVM】JVM基础教程&#xff08;一&#xff09;-CSDN博客 类加载器 什么是类加载器&#xff08;ClassLoader&#xff09; 是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。 从这个定义可以得出结论&#xff1a;Java是允许开发者写点代码…...

Appium 安装问题汇总

好生气好生气&#xff0c;装了几天了&#xff0c; opencv4nodejs 和 mjpeg-consumer 就是装不了&#xff0c;气死我了不管了&#xff0c;等后面会装的时候再来完善&#xff0c;气死了气死了。 目录 前言 1、apkanalyzer.bat 2、opencv4nodejs 3、ffmpeg 4、mjpeg-consume…...

在网安中什么是白帽子

在网络安全领域&#xff0c;白帽子是指那些专门从事网络安全研究&#xff0c;帮助企业或个人发现并修复安全漏洞的专家。以下是对白帽子的详细解释&#xff1a; 一、定义与角色 白帽子是网络安全领域的术语&#xff0c;通常指那些具备专业技能和知识的网络安全专家。他们的工作…...

C++解析URL的方式

一、URL格式为http://192.168.80.166:6666/designResLib/test/test std::vector<CString> ThkCabRMaterialStaDlg::splitAddress(const CString& address) {std::vector<CString> result;CString remaining address;result.push_back(remaining.Left(remaini…...

【软件安全】软件安全设计规范,软件系统安全设计制度(Word原件)

1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 软件全面文档清单涵盖以下核心内容&a…...

基于ZooKeeper搭建Hadoop高可用集群

ZooKeeper搭建Hadoop高可用集群 在之前安装的Hadoop3.3.6集群中HDFS NameNode 和 YARN ResourceManager 都是单节点&#xff0c;集群不具有高可用性。 HDFS 高可用架构 HDFS 高可用架构主要组件&#xff1a; Active NameNode 和 Standby NameNode&#xff1a; 两台 NameNode…...

华硕主板不能开启

正常流程&#xff1a; [主機板]BIOS如何設置主機板整合圖形(內顯)和獨立顯示卡同時顯示輸出 | 官方支援 | ASUS 台灣 如果开启了CSR兼容性模式&#xff0c;在BIOS里面&#xff0c;就必须关掉&#xff0c;才能支持多显示器&#xff0c;如下图显示的标识才会出现。...

[C++]构造函数和析构函数

一、构造函数 1.构造函数的基本概念 1.对构造函数的理解&#xff1a; 构造函数是类的一种特殊成员函数&#xff0c;其主要功能是在创建对象时进行初始化操作。它的名字与类名相同&#xff0c;并且没有返回值类型&#xff08;不能是void&#xff09;。例如&#xff0c;对于一个…...

查询品牌涉及两张表(brand、brand_admin_mapping)

文章目录 1、BrandController2、AdminCommonService3、BrandApiService3、BrandCommonService4、BrandSqlService涉及的表SQL 查询逻辑参数处理执行查询完整 SQL 逻辑参数映射总结 SELECT * FROM brand_admin_mapping WHERE admin_id 252SELECT * FROM brand WHERE id 44SELE…...

CVPR和其他2024顶会论文阅读(资源整理【1】)

CVPR 2024论文阅读(资源整理【1】) 一、3d 重建与建模论文1-Deformable 3D Gaussians for High-Fidelity Monocular Dynamic Scene Reconstruction论文2- 4D Gaussian Splatting for Real-Time Dynamic Scene Rendering论文3-GaussianDreamer: Fast Generation from Text to …...

数据库表约束完全指南:提升数据完整性和准确性

数据库表约束完全指南&#xff1a;提升数据完整性和准确性 在数据库设计中&#xff0c;表约束是确保数据完整性和准确性的关键工具。本文将详细介绍各种类型的表约束及其使用方法&#xff0c;包括非空约束、唯一约束、主键约束、外键约束、默认值约束、检查约束以及自动递增约…...

保姆级教程用vite创建vue3项目并初始化添加PrimeVue UI踩坑实录

文章目录 一、什么是PrimeVue二、详细教程1.添加PrimeVue2.配置main.js3.添加自动引入4.配置vite.config.js5.创建测试页面 一、什么是PrimeVue PrimeVue 是一个用于 Vue.js 3.x 开发的一款高质量、广受欢迎的 Web UI 组件库。 官网地址&#xff1a;https://primevue.org/ 二、…...

数据库索引

以下是关于数据库索引的详细介绍&#xff0c;包括其概念、优点和缺点&#xff0c;并附带丰富的例子&#xff1a; 一、什么是数据库索引 数据库索引是一种数据结构&#xff0c;类似于书籍的目录&#xff0c;它能够帮助数据库管理系统&#xff08;DBMS&#xff09;迅速定位和访问…...

硬件选型规则

光源选型: 先用型号中带H的&#xff0c;没有的选标准的. 光源和光源控制器的搭配需要确保接口一致。 根据型号表中的最佳工作距离和相机的尺寸。 光源控制器选型&#xff1a; 首先选择海康风格系列光源控制器考虑与光源的接口匹配。功率应该满足接近光源功率。检查是否退市…...

linux 架构详解

Linux 是一种开源的操作系统内核&#xff0c;最初由 Linus Torvalds 于 1991 年创建。它是一个基于 Unix 的操作系统内核&#xff0c;用于构建完整的操作系统。Linux 架构是指 Linux 操作系统的内部结构和组成组件的工作方式。 整体架构 Linux系统通常被看作是一个层次化的结…...

Mybatis 学习 之 XML 手册

目录 单次执行单次新增单次更新单次删除 批量执行批量新增批量更新for 循环执行更新for 循环生成多条 sql&#xff0c;一次执行 批量删除 参数传递预处理方式 (OGNL表达式 #{})数据类型转换 直接替换 (EL表达式 ${}) 安全 单次执行 单次新增 <insert id"insert"…...

平面直角坐标系

图1 平面直角坐标系 横轴为x&#xff0c;竖轴为y&#xff0c;x、y的交点为O。 表示一个点经常表示为( x, y )&#xff0c;如图上的红点( 2, 3 )。 图2 点( 2, 3 )...

K8S对接ceph的RBD块存储

1 PG数量限制问题 1.1 原因分析 1.还是老样子&#xff0c;先创建存储池&#xff0c;在初始化为rbd。 [rootceph141~]# ceph osd pool create wenzhiyong-k8s 128 128 Error ERANGE: pg_num 128 size 3 for this pool would result in 295 cumulative PGs per OSD (2067 tot…...

使用 OpenCV 进行 Android 开发

在本节中&#xff0c;我们将创建一个简单的应用程序&#xff0c;它除了加载 OpenCV 之外什么都不做。在下一节中&#xff0c;我们将扩展它以支持相机。 除了这个说明&#xff0c;你还可以使用一些视频指南&#xff0c;例如这个 打开 Android Studio 并选择Empty Views Activi…...

ubuntu下 grep 如何过滤包括G或者T字符串

在 grep 中&#xff0c;你可以通过使用正则表达式来匹配包含 G 或者 T 的字符串。例如&#xff1a; 1. 过滤包括 G 或 T 的字符串&#xff1a; grep -E G|T filename -E 表示启用扩展正则表达式&#xff08;也可以用 egrep&#xff09;。G|T 表示匹配 G 或 T。 2. 不区分大…...

【C语言】整数每一位数字出现次数

提相信你是最棒哒&#xff01;&#xff01;&#xff01; 文章目录 题目描述 题目代码 法一解析版C 法二解析版C 总结 题目描述 给出两个整数 M 和 N&#xff0c;求在序列[M, M 1, M 2,…, N - 1, N]中每一个数码出现了多少次。 输入格式 输入两个整数 M 和 N 。 输出格式…...

opencv Mat To Heif

高效率图像文件格式&#xff08;英语&#xff1a;High Efficiency Image File Format, HEIF&#xff1b;也称高效图像文件格式&#xff09;是一个用于单张图像或图像序列的文件格式。它由运动图像专家组&#xff08;MPEG&#xff09;开发&#xff0c;并在MPEG-H Part 12&#x…...

[GStreamer] gstbasesink 的 chain 函数

chain函数的定位&#xff1a; chain函数是上一个element到当前element的入口&#xff0c;chain函数处理完毕后&#xff0c;上一个函数的push_buffer 就得以返回。因此通常情况下 parent element 的核心逻辑都在 chain 函数里&#xff0c;再通过再 chain 函数里调用虚函数让 ch…...

评估大语言模型(LLM)在分子预测任务能够理解分子几何形状性能

摘要 论文地址&#xff1a;https://arxiv.org/pdf/2403.05075 近年来&#xff0c;机器学习模型在各个领域越来越受欢迎。学术界和工业界都投入了大量精力来提高机器学习的效率&#xff0c;以期实现人工通用智能&#xff08;AGI&#xff09;。其中&#xff0c;大规模语言模型&a…...

2024-12-04OpenCV视频处理基础

OpenCV视频处理基础 OpenCV的视频教学&#xff1a;https://www.bilibili.com/video/BV14P411D7MH 1-OpenCV视频捕获 在 OpenCV 中&#xff0c;cv2.VideoCapture() 是一个用于捕获视频流的类。它可以用来从摄像头捕获实时视频&#xff0c;或者从视频文件中读取帧。以下是如何使用…...

Springboot 2.7+解决跨域问题,到底是在SpringBoot中添加拦截器还是修改Nginx配置

文章目录 1摘要2 核心代码2.1 SpringBoot 全局跨域拦截器2.2 Nginx 配置跨域处理2.3 Nginx 和 SpringBoot 同时添加允许跨域处理会怎么样&#xff1f; 3 推荐参考资料 1摘要 跨域问题报错信息: Referrer Policy:strict-origin-when-cross-origin跨域问题是在前后端分离的情况…...

在Mac上安装多个Java版本

1、获取 Homebrew 的历史版本库 执行下面命令来获取 Homebrew 的历史版本库 brew tap homebrew/cask-versions2、安装java //java8 brew install java8 --cask//java11 brew install java11 --cask//java17 brew install --cask homebrew/cask-versions/microsoft-openjdk17…...

[小白系列]Ubuntu安装教程-安装prometheus和Grafana

Docker安装prometheus 拉取镜像 docker pull prom/prometheus 配置文件prometheus.yml 在/data/prometheus/建立prometheus.yml配置文件。&#xff08;/data/prometheus/可根据自己需要调整&#xff09; global:scrape_interval: 15s # By default, scrape targets ev…...

HTTP中GET和POST详细理解

HTTP中GET和POST 简单来说 GET 的语义是从服务器获取指定的资源&#xff0c;这个资源可以是静态的文本、页面、图片视频等。GET 请求的参数位置一般是写在 URL 中&#xff0c;URL 规定只能支持 ASCII&#xff0c;所以 GET 请求的参数只允许 ASCII 字符 &#xff0c;而且浏览器…...

Vant UI Axure移动端元件库:提升移动端原型设计效率

UI框架的选择对于提升开发效率和用户体验至关重要。Vant UI&#xff0c;作为一款基于Vue.js的轻量、可靠的移动端组件库&#xff0c;自2017年开源以来&#xff0c;凭借其丰富的组件库、良好的性能以及广泛的兼容性&#xff0c;在移动端开发领域崭露头角&#xff0c;赢得了众多开…...

y3编辑器文档3:物体编辑器

文章目录 一、物体编辑器简介1.1 界面介绍1.2 复用(导入导出)1.3 收藏夹(项目资源管理)1.4 对象池二、单位2.1 数据设置2.2 表现设置2.3 单位势力和掉率设置2.4 技能添加和技能参数修改2.5 商店2.5.1 商店属性设置2.5.2 商店物品设置三、装饰物3.1 属性编辑3.2 碰撞体积四、…...

【ESP32】ESP-IDF开发 | DAC数模转换器+余弦波输出例程

1. 简介 ESP32上的数字模拟转换器 (DAC) 带有 2 个 8 位通道&#xff0c;因此可输出2路模拟信号。在低功耗模式下也可由 ULP 协处理器通过控制寄存器来实现完全控制。内部自带余弦波形生成器&#xff0c;可用于生成余弦波形/正弦波形&#xff0c;用户可调整频率、振幅、相位和直…...

java中的递归

大家好&#xff0c;今天我们来学习一下java中的递归&#xff0c;相信大家应该也对递归有一点了解吧&#xff0c;如果没有也没有关系&#xff0c;我们现在就来了解一下。 五、递归 自身中包含了自己,遇到的问题直接并不好解决,但是发现将原问题拆分成其子问题之后,子问题与原问…...

残差网络连接,使得输入与输出的尺寸一样

def forward(self, x):out self.layer1(x)out self.layer2(out)# 使用插值将输入x上采样至与layer2输出相同的尺寸x F.interpolate(x, size(out.size(2), out.size(3)), modebilinear, align_cornersFalse)# 确保x的通道数与out匹配x x[:, :out.size(1), :, :] # 选择前ou…...

SAP SD学习笔记18 - 投诉处理4 - 请求书订正依赖,投诉处理流程的总结

上一章讲了 Credit/Debit Memo依赖&#xff0c;Credit/Debit Memo。Credit Memo依赖 本质上是一张受注票&#xff1b;Credit Memo 本质上是一张请求票。 SAP SD学习笔记17 - 投诉处理3 - Credit/Debit Memo依赖&#xff0c;Credit/Debit Memo-CSDN博客 本章继续讲本图中的内容…...

记录下nginx接口代理配置问题

其中api和api1是前面定义的upstream&#xff0c;ip相同只是端口不同。 一开始/api1/直接 像api一样 proxy_pass http://api1这样是不行的&#xff0c;因为会代理到 后端的 /api1/...接口&#xff0c;而后端实际接口地址是 /api/..... 所以必须像上面写法才能将外网的 /api…...

flink-connector-mysql-cdc:01 mysql-cdc础配置代码演示

flink-connector-mysql-cdc&#xff1a; 01 mysql-cdc基础配置代码演示02 mysql-cdc高级扩展03 mysql-cdc常见问题汇总04 mysql-cdc-kafka生产级代码分享05 flink-kafka-doris生产级代码分享06 flink-kafka-hudi生产级代码分享 flink-cdc版本&#xff1a;3.2.0 flink版本&…...

001-Redis介绍

目录 一、Redis 简介 二、Redis 特性 三、Redis 下载安装 四、Redis 可视化管理界面工具 一、Redis 简介 1.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的 key-value 数据库。 2. 它在内存中存储数据,并提供了持久化功能,可以将数据保存到磁盘中,它是一种 NoS…...

数据结构---单链表

目录 一、概念 二、分类 1. 单向或者双向 2. 带头或者不带头 3. 循环或者非循环 三、接口实现 1.定义结构 2、申请节点 3、尾插 4、头插 5、尾删 6、头删 7.查找&#xff0c;也可以充当修改 8、在pos之前插入x 9、在pos之后插入x ​编辑 10、删除pos位置 …...

从一个Bug谈前端响应拦截器的应用

一、问题场景 今天在开发商品管理系统时&#xff0c;遇到了一个有趣的问题&#xff1a;当添加重复的商品编号时&#xff0c;页面同时弹出了两条 "商品编号已存在" 错误提示&#xff1a; 这个问题暴露了前端错误处理机制的混乱&#xff0c;让我们从这个问题出发&…...

在做题中学习(78):数组中第K个最大元素

解法&#xff1a;快速选择算法 说明&#xff1a;堆排序也是经典解决topK问题的算法&#xff0c;但时间复杂度为&#xff1a;O(NlogN) 而将要介绍的快速选择算法的时间复杂度为: O(N) 先看我的前两篇文章&#xff0c;分别学习&#xff1a;数组分三块&#xff0c;随机选择基准…...

药剂学试卷

1【单选题】在倍氯米松气雾剂中加入四氟乙烷是用作 C A、 助悬剂 B、 乳化剂 C、 抛射剂 D、 防腐剂 2【单选题】一步制粒机可完成的工序是 B A、 粉碎→混合→制粒→干燥 B、 混合→制粒→干燥 C、 过筛→制粒→混合→干燥 D、 过筛→制粒→混合 3【单选题】小檗碱片包…...

3D 生成重建020-Gaussian Grouping在场景中分割并编辑一切

3D 生成重建020-Gaussian Grouping在场景中分割并编辑一切 文章目录 0 论文工作1 方法2 实验结果 0 论文工作 最近提出的高斯Splatting方法实现了高质量的实时三维场景新视角合成。然而&#xff0c;它仅仅关注外观和几何建模&#xff0c;缺乏细粒度的物体级场景理解。为了解决…...

力扣143.重排链表

题目描述 题目链接143. 重排链表 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值&#xff…...

本文介绍麒麟信安服务器系统(kylinsec)的安装。

本文介绍麒麟信安服务器系统&#xff08;kylinsec&#xff09;的安装。 下载 在开源欧拉官方找到商业版本的介绍找到相关产品&#xff1a; https://www.openeuler.org/zh/download/commercial-release/ 麒麟信安kylinsec下载地址&#xff1a; https://mirrors.kylinsec.com…...

单链表---回文结构

判断某一个单链表是否是回文结构&#xff0c;是返回true、不是返回false。 所谓的回文结构&#xff0c;就是类似对称结构&#xff1a; 对于奇数与偶数个结点均是如此。 那么就有思路&#xff1a;①找到链表的中间结点②逆置后半部分或前半部分③比较两者 ①找中间结点&#x…...

Java --- 反射

目录 一.什么是反射&#xff1f; 二.反射的核心方法和功能&#xff1a; 1.获取类的元信息&#xff1a; 2. 动态实例化对象&#xff1a; 3. 访问字段&#xff08;包括私有字段&#xff09;&#xff1a; 4. 调用方法&#xff08;包括私有方法&#xff09;&#xff1a; 5.…...

python编程Day12-属性和方法的分类

私有和公有 在python中 定义类的时候&#xff0c;可以给 属性和方法设置 访问权限&#xff0c;即规定在什么地方可以使用。 权限一般分为两种&#xff1a;公有权限、私有权限 公有权限 定义&#xff1a;直接定义的属性和方法就是公有的特点&#xff1a; 可以在任何地方访问和使…...

C#实现TCP客户端和服务器

本文将介绍如何使用C#实现TCP客户端和服务器的基本功能&#xff0c;客户端与服务器可以相互发送消息。 效果展示 服务器端实现 首先&#xff0c;我们实现TCP服务器。以下是服务器端所需的类和代码&#xff1a; using System; using System.Collections.Generic; using Syste…...

数据库编程: JDBC 中数据库驱动包的安装,配置及引用

目录 驱动包的下载安装 1. 去oracle 官方网站下载 2. github 的开源软件 3. 中央仓库(推荐使用这个) 驱动包的配置及引用 1. 第一步: 打开idea, 在 idea 中创建新的项目 2. 然后我们要在 jdbc_1 目录下创建一个新的目录包 3. 最后引入MySQL 的驱动包, 作为项目的依赖 尾…...