类加载 - 双亲委派机制详解

news2025/1/22 12:32:00

     1、类加载器有哪些

  1. 启动类加载器(Bootstrap Class Loader):它是Java虚拟机的一部分,负责加载Java核心类库,如java.lang包中的类。它是最顶层的类加载器,由C++实现,不是Java类。

  2. 扩展类加载器(Extension Class Loader):它负责加载Java的扩展类库,位于JRE的lib/ext目录下。它是由Java编写的类加载器,是由启动类加载器加载的。

  3. 应用程序类加载器(Application Class Loader):也称为系统类加载器,它负责加载应用程序的类,包括用户自定义的类和第三方类库。它是ClassLoader类的子类,通常是Java程序中默认的类加载器。

  4. Java还支持自定义类加载器,可以通过继承ClassLoader类来实现。自定义类加载器可以用于加载非标准的类文件,实现类的动态加载等功能。

2、双亲委派模型

  • 每一个Class都有对应的ClassLoader。
  • 每个ClassLoader都有一个“父”类加载器。BootatrapClassLoader类加载器除外,它是最顶层的类加载器。
  • 对于一个类加载的请求,总是优先委派给“父”类加载器来尝试加载。
  • 对于用户自定义的类加载器,默认的“父”类加载器是AppClassLoader。

注:这里的父类不是继承上的父类,而是一个组合关系,例如在Application Class Loader加载器当中有个parent变量,指向Extension Class Loader对象,然后通过这个parent变量来加载这个类。

3、双亲委派过程模拟

 4、从源码上分析双亲委派过程

loadClass方法:根据类的全限定名来加载并创建一个类对象的入口。

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
{
    synchronized (getClassLoadingLock(name)) {
        // 首先,检查类是否已经被加载
        Class<?> c = findLoadedClass(name);
        if (c == null) {
            long t0 = System.nanoTime();
            try {
                if (parent != null) {
                    // 如果存在父类加载器,则委托给父类加载器加载类
                    c = parent.loadClass(name, false);
                } else {
                    // 否则,尝试从引导类加载器加载类
                    c = findBootstrapClassOrNull(name);
                }
            } catch (ClassNotFoundException e) {
                // 如果在非空父类加载器中找不到类,则抛出ClassNotFoundException
            }

            if (c == null) {
                // 如果仍然找不到类,则调用findClass方法来查找类
                long t1 = System.nanoTime();
                c = findClass(name);

                // 这是定义类加载器;记录统计信息
                sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                sun.misc.PerfCounter.getFindClasses().increment();
            }
        }
        if (resolve) {
            // 如果resolve参数为true,则解析类
            resolveClass(c);
        }
        return c;
    }
}

5、 双亲委派的优缺点

优点:

  1. 安全性:通过双亲委派机制,类加载器可以按照一定的规则进行类加载,从而提高了系统的安全性。它可以避免恶意代码的注入和类的重复加载。

  2. 避免类的冲突:双亲委派机制可以避免类的冲突问题。当多个类加载器都能够加载同一个类时,由于双亲委派机制的存在,只会使用最先加载的类,从而避免了类的冲突。

  3. 提高性能:由于双亲委派机制的存在,类加载器可以重用已经加载过的类,从而提高了系统的性能。当一个类被加载后,它会被缓存起来,下次再次加载该类时,可以直接使用缓存中的类,而不需要重新加载。

  4. 用来确定类的“唯一性”:一个类当全限定名相等但是被不同的类加载器加载出来的话,我们不认为这个两个类是同一个。所以即使都来自于同一个class文件但是由不同类加载器加载的那就是两个独立的类。

缺点:

  1. 灵活性受限:双亲委派机制在一定程度上限制了类加载器的灵活性。有时候,我们可能需要自定义类加载器来实现一些特殊的需求,但双亲委派机制可能会限制我们的自定义能力。

  2. 扩展性受限:在某些情况下,我们可能希望在特定的类加载器中加载一些特殊的类,而不是委派给父类加载器。但双亲委派机制会限制我们的扩展性,因为它要求先尝试由父类加载器加载。

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

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

相关文章

效率逆天GPT-4一天顶6个月,颠覆审核行业

内容审核一直被视为互联网大厂中的脏活和累活。就拿审文章来说&#xff0c;审核员们一天要审约2000篇文章&#xff0c;724h工作制&#xff0c;经常过着昼夜颠倒的日子&#xff0c;更要命的是&#xff0c;他们每天都要接收各种低俗污秽内容&#xff0c;久而久之&#xff0c;心理…

4.物联网LWIP之C/S编程

LWIP配置 服务器端实现 客户端实现 错误分析 一。LWIP配置&#xff08;FREERTOS配置&#xff0c;ETH配置&#xff0c;LWIP配置&#xff09; 1.FREERTOS配置 为什么要修改定时源为Tim1&#xff1f;不用systick&#xff1f; 原因&#xff1a;HAL库与FREERTOS都需要使用systi…

MQTT协议--技术文档--搭建mqtt服务器--《EMQX单体服务器部署》

产品概览 | EMQX 5.1 文档 什么是EMQX&#xff1f; EMQX 是一款开源 (opens new window)的大规模分布式 MQTT 消息服务器&#xff0c;功能丰富&#xff0c;专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条&#xff0c;单服务器的传输与处理…

前端开发工具及环境配置

1.前端开发环境node npm环境配置 第一步&#xff1a;打开Download | Node.js (nodejs.org)下载&#xff0c;解压。 找到下载压缩包进行解压 解压到D盘目录下&#xff1a; 第二步&#xff1a;配置环境变量&#xff1a;右击此电脑点击属性进入高级系统设置 点击高级系统设置进入…

泛微E8配置自定义触发流程失败

在新公司接了个配置泛微流程触发的活。因为泛微的官方文档并没有详细的操作指引&#xff0c;在测试环境配置之后、要触发的流程可以手工提交&#xff0c;但是触发一直不成功。简单记录下业务场景和其他处理信息&#xff0c;以供参考。 应用版本 目前使用了泛微 E8 &#xff0…

无涯教程-Perl - warn函数

描述 此函数将LIST的值打印到STDERR。基本上与die函数相同,除了不对出口进行任何调用并且在eval语句内不引发异常。这对于引发错误而不导致脚本过早终止很有用。 如果变量$包含一个值(来自先前的eval调用),并且LIST为空,则$的值将以。\t.caught打印。附加到末尾。如果$和LIST…

GPT-4一纸重洗:从97.6%降至2.4%的巨大挑战

斯坦福大学和加州大学伯克利分校合作进行的一项 “How Is ChatGPTs Behavior Changing Over Time?” 研究表明&#xff0c;随着时间的推移&#xff0c;GPT-4 的响应能力非但没有提高&#xff0c;反而随着语言模型的进一步更新而变得更糟糕。 研究小组评估了 2023 年 3 月和 20…

为AI而生的数据库:Milvus详解及实战

1 向量数据库 1.1 向量数据库的由来 在当今数字化时代&#xff0c;人工智能AI正迅速改变着我们的生活和工作方式。从智能助手到自动驾驶汽车&#xff0c;AI正在成为各行各业的创新引擎。然而&#xff0c;这种AI的崛起也带来了一个关键的挑战&#xff1a;如何有效地处理和分析…

lama-cleaner:基于SOTA AI 模型Stable Diffusion驱动的图像修复工具

介绍 由 SOTA AI 模型提供支持的图像修复工具。从照片中删除任何不需要的物体、缺陷、人物&#xff0c;或擦除并替换&#xff08;由Stable Diffusion驱动&#xff09;照片上的任何东西。 特征 1.多种SOTA AI模型 擦除模型&#xff1a;LaMa/LDM/ZITS/MAT/FcF/Manga 擦除和替…

Spring的生命周期及Spring Bean单例和多例---超详细教学

一&#xff0c;何为spring生命周期 一个Bean对象从被Spring容器创建到被销毁的整个过程。Spring框架对Bean对象的生命周期进行了管理&#xff0c;提供了灵活性和控制权&#xff0c;让开发人员能够在不同的阶段进行自定义操作 1.1生命周期图 1.2.为什么要学习对象的生命周期…

source insight 添加宏-文件头加注释

source insight 3.5 自带的一些宏&#xff0c;在安装目录下的 utils.em 文件中&#xff0c;用户也可以自己写文件&#xff0c;命令为xxx.em &#xff0c;然后把这个文件添加到项目中即可&#xff0c;添加后在菜单栏 Options -> Key Assignments 里输入macro 就能显示新添加的…

【校招VIP】产品分析之策略量化分析

考点介绍&#xff1a; 产品的设计和迭代需要通过数值来进行分析&#xff0c;那么如何去制定一个数值策略&#xff0c;区分好坏的情况&#xff0c;就会非常的重要。属于数据量化的范畴。 『产品分析之策略量化分析』相关题目及解析内容可点击文章末尾链接查看&#xff01; 一、…

解决微信消息接收问题,原来只需设置这三个地方,让你涨知识

在日常使用微信的过程中&#xff0c;你是否曾经遇到过无法接收消息或消息延迟的问题&#xff1f;如果是的话&#xff0c;别着急&#xff01;今天&#xff0c;我们将为你揭示解决这个问题的简单方法&#xff0c;原来只需设置这三个地方&#xff0c;让你的微信恢复正常运行。 首先…

openGauss学习笔记-43 openGauss 高级数据管理-事件触发器

文章目录 openGauss学习笔记-43 openGauss 高级数据管理-事件触发器43.1 语法格式43.2 参数说明43.3 示例 openGauss学习笔记-43 openGauss 高级数据管理-事件触发器 触发器会在指定的ddl事件发生时自动执行函数。目前事件触发器仅在PG兼容模式下可用。 43.1 语法格式 创建事…

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,数组)二(113)

需求&#xff1a; 有一个List<Map<String.Object>>,存储了区域的数据&#xff0c; 数据是根据用户查询条件进行显示的&#xff1b;所以查询的数据是动态的&#xff1b;按区域维度统计每个区域出现的次数&#xff0c;并且按照次数的大小排序&#xff08;升序&#…

在线零售供应链管理:从0到100

全球57%的公司将其供应链视为竞争优势&#xff0c;然而只有6%的人表示完全了解它。无论您是首次在线卖家还是经验丰富的专业人士&#xff0c;驾驭管理高效且具有成本效益的零售供应链的复杂性都可能具有挑战性。一起来了解一下吧&#xff01; 供应链管理是什么&#xff1f;它基…

【LeetCode75】第三十一题 反转链表

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 最经典的链表题&#xff0c;没有之一&#xff01;&#xff01;&#xff01; 强烈建议直接把模板记住&#xff01;&#xff01;&#xf…

FairyGUI编辑器自定义菜单扩展插件

本文涉及到的软件有&#xff1a;FairyGUI&#xff0c;VSCode 代码环境涉及到了&#xff1a;Lua VSCode插件&#xff1a;EmmyLua 在编写FairyGUI编辑器菜单前&#xff0c;了解一下FairyGUIEditor的API会有效的帮助我们解决很多问题。FairyGUI的扩展是通过编辑器自带的插件功能…

sed 语法和基础命令

1. 准备工作 准备备一个数据文件data.txt&#xff0c;内容如下&#xff1a; 101,Zhang san,Fu Jian 102,Li si,Shan Dong 103,Wang Wu,Bei Jing 104,Zhao Qian Sun,Zhe Jiang 105,Ge Lin,Shang Hai 每一行为一条数据&#xff0c;每条数据包含三个元素&#xff1a;ID&#xf…