java中的类加载器

article/2025/9/18 7:16:30

文章目录

  • 前言,
  • 一、加载器的作用是什么
  • 二、详解类加载器
    • 1.不得不说的双亲委派机制
    • 2.各个加载器加载的内容
    • 3.线程上下文类加载器
    • 4.类加载器的庐山真面目
  • 总结


前言,

java中一般来说有三种类加载器,分别为: 引导加载器,扩展加载器,应用加载器,还有一个线程上下文类加载器


一、加载器的作用是什么

使Java 类可以被动态加载到 Java 虚拟机中并执行;

  • 这样动态加载的的好处是什么?
    可以实现热插拔式的编程;

举个栗子:
springdata中支持多种数据源,例如mysql;但是当我不去配置mysql的yml的时候,它就不会去加载它,也不会报错;当我配置了yml的时候,它就开始验证驱动包是否存在,用户名密码是否正确了
但是自始至终springdata的相关自动配置都是在的,仅仅是没有被加载而已,这就是插件式;

二、详解类加载器

1.不得不说的双亲委派机制

双亲委派机制

例如加载HelloWorld的时候的类加载过程:
1、寻找jre目录,寻找jvm.dll,并初始化JVM;
2、产生一个Bootstrap Loader(启动类加载器);
3、Bootstrap Loader自动加载Extended Loader(标准扩展类加载器),并将其父Loader设为Bootstrap Loader。
4、Bootstrap Loader自动加载AppClass Loader(应用/系统类加载器),并将其父Loader设为Extended Loader。
5、最后由AppClass Loader加载HelloWorld类。

用大白话说就是: 应用类加载器为最底层,当加载一个类的时候,一般从应用类加载器开始加载,但是每次他都不是直接加载的,而且去父类中找下,看是不是已经加载了,加载了的话,就结束了,应用类加载器就不加载饿了,他的父类: 扩展类加载器也做了同样操作;

双亲委派机制的作用是什么?

①防止加载同一个.class。通过委托去询问上级是否已经加载过该.class,如果加载过了,则不需要重新加载。保证了数据安全。
②保证核心.class不被篡改。通过委托的方式,保证核心.class不被篡改,即使被篡改也不会被加载,即使被加载也不会是同一个class对象,因为不同的加载器加载同一个.class也不是同一个Class对象。这样则保证了Class的执行安全。

第一个点说的已经很清楚了,第二点我这里解析下
例如: 我自己新建了一个String.java,它与java中的是同名的一个类,这样的话,双亲委派机制可以保证,它不会被加载,如果被加载,相当于篡改了原java对象;其次就算加载了,问题也不是太大,因为默认的java基类,都是通过启动类加载器加载的,而我们自己的写的文件,通常是通过应用加载器加载的,所以也可以保证原java基类的安全;

2.各个加载器加载的内容

1.BootstrpLoader
BootstrpLoader是一个启动类加载器,是Java类中最顶层的类加载器,常用于加载JDK中的核心类库,如rt.jar、resources.jar、charsets.jar等。2.ExtClassLoader
ExtClassLoader是一个扩展类加载器,常用于加载java的扩展类库,可以加载JAVA_HOME/jre/lib/ext/目录中的所有jar。3.AppClassLoader
AppClassLoader是一个系统类加载器,是java程序的默认类加载器,常用于加载classpath所指定位置的类或jar包,可以加载java中的classpath或java.class.path系统属性。

3.线程上下文类加载器

它的出现打破了之前提到的双亲委派机制,就是原来 自己先不加载而是去父类中找,相当于委托给父类去加载;
打破之后变为: 原本应该是父类加载,但是由于加载不到,所以父类委托了子类, 应用加载器去加载,委托关系反过来了,应用类加载器加载成功,就ok了,如果也加载不到 直接排除异常 java.lang.ClassNotFoundException;

  • 打破双亲委派机制得原因

例如: 加载mysql驱动
在加载第三方类库时,加载Driver类的实现类时,一开始就不是系统类加载器去加载的,而是直接使用启动类加载器进行加载
因为本身这个类就是java 基类中提供的,它仅仅是去找实现类而已;但是它找不到,因为java基类只提供了接口标准,没有提供实现类
由于驱动仅仅是一个标准,由各个厂商实现,需要运行时动态获取,那么启动类无法加载,最终能加载的就只能是应用类加载器
相当于之前的双亲委派模式顺序变了,父类先尝试加载未加载成功,然后子类去加载了
但他不是直接去找了子类,而是通过一个叫做线程上下文类加载器,但这个类加载器,实际上就是应用类加载器

  • 打破双亲委派机制的目的

在某些情况下,需要跳出双亲委派机制,以便自定义类加载器可以加载某些特定的类,从而实现某些特定的功能。Spring框架就是一个典型的例子,它需要跳出双亲委派机制,以便在某些特定的情况下,自定义类加载器可以加载Spring的某些特定的类,从而实现Spring的一些特定的功能。
例如: springboot 中yml 我没有mysql的相关配置,那么就不会报错,当我写入了mysql配置,开始验证驱动包是否存在,用户名密码是否正确~,这也是springboot实现热插拔的主要手段
当多个版本的jar共存的时候,例如 jdk版本,类全路径都是一样的,但是版本不通,一台机器上就是需要两个版本共用,且各自隔离;
打破双亲委派机制的目的

4.类加载器的庐山真面目

  • 这就是四个类加载器了
    	 //扩展类加载器MainClassLoader classLoader = Abc.class.getClassLoader();//表示当前线程的类加载器——应用程序类加载器ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();//—启动类加载器ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();// 启动类加载器ClassLoader application = String.class.getClassLoader();
  • 开图验证~
    类加载器

1 从图中可以看出,我们是利用当前的应用加载器一直向上寻找父级
2 可以看到while循环经过了两次就停止了,说明找到了扩展类加载器
3 当扩展类加载器再去找父级的时候,启动类加载器为null
4 再次验证下,利用String.class,再次找一次启动类加载器,仍然为null
5 这是由于默认被隐藏了,不对外暴露,实际上是存在的


总结

个人理解:

  1. 类加载器可以动态将一些类加载的虚拟机中,与sping中的ioc类似;
  2. spring中就是利用线程上下文类加载器,不停的判断是否需要加载某些类,卸载,装载这些类,从而实现了热插拔,其实就是spi机制;
  3. spring中的 spring.factories 或者是 spring-configuration-metadata.json 同样也是spi的一种实现,与原始java中的spi异曲同工;

有错误之处,请指教,相互学习;

参考文章:

  1. 双亲委派机制
  2. 为何要打破双亲委派机制
  3. 四次打破双亲委派机制的原因
  4. 线程类加载器
  5. 打破双亲委派的验证

http://chatgpt.dhexx.cn/article/PfMOxQrd.shtml

相关文章

JVM类加载器

文章目录 一、类加载器二、类与类加载器三、双亲委派模型四、破坏双亲委派模型4.1、Tomcat4.1.1、WebApp类加载器4.1.2、Shared类加载器4.1.3、Catalina类加载器4.1.4、Common类加载器4.1.5、Jsp类加载器 4.2、JDBC 一、类加载器 从Java虚拟机的角度来讲,只存在两种…

自定义类加载器

目录 一、为什么要自定义类加载器? 二、常见的场景 三、实现方式 四、自定义类加载器示例 五、Java9新特性 一、为什么要自定义类加载器? 隔离加载类 在某些框架内进行中间件与应用的模块隔离,把类加载到不同的环境。比如:…

类加载器详解(自己实现类加载器)

目录&#xff1a; java虚拟机汇总 class文件结构分析 1).class文件常量池中的常量项结构 2). 常用的属性表的集合类加载过程 1).类加载器的原理以及实现<< 现在位置虚拟机结构分析 1).jdk1.7和1.8版本的方法区构造变化 2).常量池简单区分对象结构分析 1).压缩指针详解gc…

JVM——自定义类加载器

0. 为什么需要自定义类加载器 网上的大部分自定义类加载器文章&#xff0c;几乎都是贴一段实现代码&#xff0c;然后分析一两句自定义ClassLoader的原理。但是我觉得首先得把为什么需要自定义加载器这个问题搞清楚&#xff0c;因为如果不明白它的作用的情况下&#xff0c;还…

JVM - 类加载器

# 类加载器及类加载器执行过程 JDK版本&#xff1a;1.8 # 1、类加载器子系统 下图为类加载子系统&#xff1a; 类加载子系统负责从文件系统或者网络中加载class文件&#xff0c;class文件在文件开头有特定的文件标识&#xff08;CA FE BA BE&#xff09;。Classloader只负责cl…

java的类加载器以及如何自定义类加载器

ClassLoader作用 类加载流程的"加载"阶段是由类加载器完成的。 类加载器结构 结构&#xff1a;BootstrapClassLoader&#xff08;祖父&#xff09;–>ExtClassLoader&#xff08;爷爷&#xff09;–>AppClassLoader(也称为SystemClassLoader)&#xff08;爸…

类加载器(ClassLoader)

一、类加载器&#xff08;ClassLoader&#xff09; 1.1 什么是类加载器 Java的类加载器是Java虚拟机&#xff08;JVM&#xff09;的重要组成部分&#xff0c;它的主要作用是动态地将Java类加载到JVM中&#xff0c;以便在运行时使用这些类。Java类加载器通常是由JVM的实现者提供…

什么是类加载器,类加载器如何分类

一、类加载器 1.什么是类加载器 类加载器&#xff1a;负责将.class文件&#xff08;存储的物理文件&#xff09;加载到内存中 2.类加载时机&#xff1a; ① 创建类的实例&#xff08;对象&#xff09; ② 调用类的实例方法 ③ 访问类或者接口的类变量&#xff0c;或者为该…

深入理解Java虚拟机——再谈类的加载器——第十二章——中篇

深入理解Java虚拟机——Java虚拟机介绍——第一章 深入理解Java虚拟机——类加载子系统——第二章 深入理解Java虚拟机——运行时数据区和本地方法接口——详细篇——第三章 深入理解Java虚拟机——对象的实例化内存布局与访问定位——超级详细篇——第四章 深入理解Java虚拟机…

类加载器详解

类加载器的分类 JVM支持两种类型的类加载器,分别为引导类加载器(BootstrapClassLoader)和自定义类加载器(User-Defined ClassLoader) 从概念上来讲, 自定义类加载器一般指的是程序中由开发人员自定义的一类,类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类…

Java - 类加载器

文章目录 1. 类加载的过程2. 类加载器的分类2.1 引导类加载器 Bootstrap2.2 扩展类加载器 ExtClassLoader2.3 系统类加载器 AppClassLoader2.4 三者之间的关系2.5 自定义类加载器2.6 注&#xff1a;谁来准备类加载器呢? 3. 双亲委派机制4. ClassLoader抽象类5. URLClassLoader…

DAU 和 MAU

DAU 和 MAU 日活跃用户占月活跃用户的比例越高&#xff0c;表明用户对App的使用粘性越高。 DAU&#xff0c;即&#xff1a;Daily Active User&#xff0c;指日活跃用户数 MAU&#xff0c;即&#xff1a;Monthly Active User&#xff0c;指月活跃用户数。 *例子1&#xff1a;…

如何通过DAU分析活跃用户?(案例:python绘制箱体图)

前言&#xff1a;本文内容以游戏产品为基础进行讲解&#xff0c;内容为以下4部分&#xff1a; 1. 如何理解DAU反映了哪些问题&#xff1f; 2. 有哪些因素会影响DAU变动&#xff1f; 3. 如何解读DAU的“箱体图”&#xff1f; 4. 如何使用python绘制“箱体图”&#xff1f; DAU的…

【数据分析】产品日活DAU下降,怎么分析

目录 案例简介 第一步&#xff1a;确认数据真实性 第二步&#xff1a;明确定义&#xff0c;并拆解指标&#xff0c;进一步定位原异常部分 第三步&#xff1a;根据几个常见维度初步拆分数据 第四步&#xff1a;进一步做假设并细分深入&#xff0c;得出结论 案例分析 例题…

数据分析——DAU下降问题(转)

文章转自&#xff1a; DAU异常下降该如何分析 1. 梳理公司的用户增长模式 尽管不同业务形态、以及不同发展阶段的公司&#xff0c;其用户增长模式各有差异&#xff0c;但都可以从拉新策略和促活策略进行分解。 常见的拉新策略有&#xff1a; 流量采购。比如通过厂商预装、…

有赞一面:亿级用户DAU日活统计,有几种方案?

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如极兔、有赞、希音、百度、网易、滴滴的面试资格&#xff0c;遇到一几个很重要的面试题&#xff1a; (1) 亿级用户场景&#xff0c;如何高性能统计日活&#xff1f; (2) 如何实现亿…

数据分析——用户粘性指标 DAU/MAU

&#xff08; 一 &#xff09;定义 DAU&#xff0c;即&#xff1a;Daily Active User&#xff0c;指日活跃用户数&#xff1b; MAU&#xff0c;即&#xff1a;Monthly Active User&#xff0c;指月活跃用户数。 日活/月活就是体现用户粘性最频繁使用的指标。日活跃用户占月活…

数据分析体系 - 用户粘性(DAU/MAU 和 月人均活跃天数)

对于常见的App&#xff0c;用户粘性的取值范围就是3%~100%&#xff0c; 不同领域的App也会有不同的基准值&#xff0c; 例如移动游戏会以20%为基线&#xff0c; 而工具类App会以40%为基线。 用户粘性的两个计算指标&#xff1a; 1、DAU/MAU 2、月平均活跃人数 这里其实…

数据分析——DAU下降/上升原因分析

本文是对“DAU变动原因”问题进行的思考整理&#xff0c;仅作记录&#xff0c;欢迎讨论。 &#xff08; 一 &#xff09;思维框架 图版&#xff1a; 文版&#xff1a; 内部原因&#xff1a; 1. 数据验证 如果DAU上升或者下降&#xff0c;且非日常波动&#xff0c;需先确…

数据分析 — 用户粘性的两个计算指标(DAU/MAU和月人均活跃天数)

很多运营都了解DAU&#xff08;日活跃用户数&#xff09;和MAU&#xff08;月活跃用户数&#xff09;的重要性&#xff0c;但在某些情况下这两个数值本身并不能反映出太多问题&#xff0c;这个时候就要引用到【DAU/MAU】的概念&#xff0c;即【日活/月活】。 用户粘性的两个计…