网站建设管理成本估计/中小企业管理培训课程

网站建设管理成本估计,中小企业管理培训课程,微信分销系统多层,wordpress 邮箱发布虽然双亲委派模型是 Java 类加载机制的推荐实现方式,但在某些情况下,为了实现特定的功能,可能需要打破双亲委派模型。以下是一些常见的打破双亲委派模型的方法和场景: 1. 重写 loadClass 方法 (不推荐): 原理: java.l…

虽然双亲委派模型是 Java 类加载机制的推荐实现方式,但在某些情况下,为了实现特定的功能,可能需要打破双亲委派模型。以下是一些常见的打破双亲委派模型的方法和场景:

1. 重写 loadClass 方法 (不推荐):

  • 原理: java.lang.ClassLoaderloadClass 方法实现了双亲委派模型的逻辑。默认情况下,loadClass 方法会先检查类是否已经被加载过,如果没有,则委托给父类加载器加载。如果父类加载器无法加载,则调用 findClass 方法尝试自己加载。

  • 打破方式: 重写 loadClass 方法,不遵循双亲委派模型的逻辑,而是直接调用 findClass 方法尝试自己加载类,或者自定义加载逻辑。

  • 示例:

    public class MyClassLoader extends ClassLoader {@Overridepublic Class<?> loadClass(String name) throws ClassNotFoundException {// 不再委托给父类加载器,直接尝试自己加载return findClass(name); }@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {// 实现自定义的类加载逻辑// ...}
    }
    
  • 缺点:

    • 破坏了双亲委派模型的优点: 可能会导致类的重复加载、核心类库被篡改等问题。
    • 容易出错: 需要自己处理类加载的各种细节,容易出错。
    • 不推荐: 除非有非常特殊的需求,否则不建议重写 loadClass 方法。

2. 使用线程上下文类加载器 (Thread Context ClassLoader):

  • 原理:
    • 每个线程都有一个关联的上下文类加载器 (Context ClassLoader)。
    • 可以通过 Thread.currentThread().getContextClassLoader() 获取当前线程的上下文类加载器。
    • 可以通过 Thread.currentThread().setContextClassLoader(ClassLoader cl) 设置当前线程的上下文类加载器。
    • 如果没有设置,线程上下文类加载器默认是应用程序类加载器 (AppClassLoader)。
  • 打破方式:
    • 在需要打破双亲委派模型的地方,获取当前线程的上下文类加载器,并使用它来加载类。
    • 例如,JDBC 驱动程序通常由应用程序类加载器加载,但 JDBC API (如 java.sql.DriverManager) 需要能够加载这些驱动程序。DriverManager 会使用线程上下文类加载器来加载驱动程序。
  • 应用场景:
    • SPI (Service Provider Interface): Java 中的 SPI 机制(例如 JDBC、JNDI、JAXP 等)通常使用线程上下文类加载器来加载服务提供者的实现类。
    • 框架和容器: 一些框架和容器(例如,Tomcat、Spring)会使用线程上下文类加载器来加载应用程序的类或资源。
  • 示例:
       // 获取当前线程的上下文类加载器ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();// 使用上下文类加载器加载类try {Class<?> myClass = contextClassLoader.loadClass("com.example.MyClass");// ...} catch (ClassNotFoundException e) {// ...}

3. 自定义类加载器并重写 findClass 方法 (推荐):

  • 原理:
    • 继承 java.lang.ClassLoader,并重写 findClass 方法。
    • findClass 方法中实现自己的类加载逻辑,例如从特定的目录、URL 或数据库中加载类。
  • 优点:
    • 可以灵活地控制类的加载过程。
    • 可以实现一些特殊的功能,例如热部署、模块化等。
  • 示例: (前面已经提供过,此处不再重复)

4. OSGi (Open Service Gateway initiative):

  • 原理:
    • OSGi 是一个模块化系统,每个模块(bundle)都有自己的类加载器。
    • OSGi 的类加载器模型不是严格的双亲委派模型,而是更复杂的网状结构。
    • OSGi 允许模块显式地声明它们依赖的其他模块,以及它们导出的包。
    • OSGi 框架会根据这些声明来解析模块之间的依赖关系,并加载相应的类。
  • 打破方式: OSGi 的类加载器模型本身就不是双亲委派模型。

5. Tomcat 的类加载器:

  • 原理:
    • Tomcat 为了实现 Web 应用程序之间的隔离,以及共享库的加载,使用了多个类加载器。
    • Tomcat 的类加载器结构:
      • Bootstrap: 加载 JVM 启动所需的类。
      • System: 加载 Tomcat 自身的类。
      • Common: 加载 Tomcat 和所有 Web 应用程序都可以访问的类 (例如, JDBC 驱动)。
      • WebappX: 每个 Web 应用程序都有一个独立的 WebAppClassLoader,负责加载该应用程序的类 (位于 WEB-INF/classesWEB-INF/lib 目录下).
      • Shared: (可选) 存放所有web应用共享的类.
  • 加载顺序:
    1. Bootstrap
    2. System
    3. Common
    4. WebappX (先在 WEB-INF/classes 中查找, 再在 WEB-INF/lib 中查找,最后才委托给父类加载器).
    5. Shared (如果配置了的话)
  • 打破双亲委派:
    • WebAppClassLoader 会优先在自己的范围内查找类,而不是立即委托给父类加载器, 这打破了双亲委派模型。
    • 这样做的好处是:
      • 隔离性: 不同的 Web 应用程序可以使用不同版本的类库,而不会相互干扰。
      • 灵活性: Web 应用程序可以覆盖 Tomcat 或共享库提供的类。

总结:

打破双亲委派模型的主要方法有:

  • 重写 loadClass 方法 (不推荐)。
  • 使用线程上下文类加载器 (常用于 SPI 机制)。
  • 自定义类加载器并重写 findClass 方法 (推荐)。
  • OSGi 模块化系统 (使用自定义的类加载器模型)。
  • Tomcat 的类加载机制.

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

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

相关文章

Java 大视界 -- 基于 Java 的大数据隐私计算在医疗影像数据共享中的实践探索(158)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

logstash收集数据

防止ES的的I/O的压力过大&#xff0c;使用redis/kafka进行缓冲。 对redis的要求 Redis input plugin | Logstash Reference [8.17] | Elastic 一般企业要求的架构 我实现的架构 filebeat把数据传给logstash 配置好filebeat把收集到的数据输入到redis 然后执行命令&#xff0…

MAXKB部署,使用和注意事项

MaxKB Max Knowledge Base&#xff0c;是一款基于大语言模型和 RAG 的开源知识库问答系统&#xff0c;广泛应用于智能客服、企业内部知识库、学术研究与教育等场景。作为一款专注于知识库问答场景的软件产品&#xff0c;MaxKB 能够为企业的智能化进程注入新的动力&#xff0c;…

docker - compose up - d`命令解释,重复运行会覆盖原有容器吗

docker - compose up - d`命令解释,重复运行会覆盖原有容器吗 docker - compose up - d 是一个用于管理 Docker 容器的命令,具体含义如下: 命令含义: up:用于创建、启动并运行容器,会根据 docker - compose.yml 文件中定义的服务配置来操作。-d:表示以“分离模式”(det…

03-SpringBoot3入门-配置文件(自定义配置及读取)

1、自定义配置 # 自定义配置 zbj:user:username: rootpassword: 123456# 自定义集合gfs:- a- b- c2、读取 1&#xff09;User类 package com.sgu.pojo;import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.spring…

进程状态:Linux的幕后指挥管理,穿越操作系统进程的静与动

文章目录 引言&#xff1a;进程的生命与状态&#xff1a;动与静的交响曲一、操作系统中的进程状态概述1.1 经典的进程状态模型1.2 进程状态转换图 二、Linux操作系统中的进程状态2.1 Linux进程状态的分类2.2 各状态的详细解释 2.3 Linux进程状态表2.4 使用ps查看进程状态三、进…

MOSN(Modular Open Smart Network)-05-MOSN 平滑升级原理解析

前言 大家好&#xff0c;我是老马。 sofastack 其实出来很久了&#xff0c;第一次应该是在 2022 年左右开始关注&#xff0c;但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFAStack-00-sofa 技术栈概览 MOSN&#xff08;Modular O…

构建高可用性西门子Camstar服务守护者:异常监控与自愈实践

在智能制造领域,西门子Camstar作为领先的MES系统承载着关键生产业务。但在实际运维中,我们发现其服务常因数据库负载激增(如SQL阻塞链超时)或应用服务器资源耗尽(CPU峰值达90%以上)导致服务不可用。传统人工干预方式平均故障恢复时间长达47分钟,这对连续生产场景构成了严…

arm之s3c2440的I2C的用法

基础概念 IC&#xff08;Inter-Integrated Circuit&#xff09;又称I2C&#xff0c;是是IICBus简称&#xff0c;所以中文应该叫集成电路总线。 IIC的总线的使用场景&#xff0c;所有挂载在IIC总线上的设备都有两根信号线&#xff0c;一根是数据线SDA&#xff0c;另一 根是时钟…

STM32F103_LL库+寄存器学习笔记10 - DMA传输过半+DMA传输完成中断实现DMA串口接收“双缓冲“

导言 《[[STM32F103_LL库寄存器学习笔记09 - DMA串口接收与DMA串口发送&#xff0c;串口接收空闲中断]]》上一章节完成DMA发送与接收。此时&#xff0c;有一个致命的问题可能会导致数据包丢失。原因是USART1接收只开启了接收空闲中断(IDLE)&#xff0c;DMA在连续模式下&#xf…

李宏毅机器学习笔记06 | 鱼和熊掌可以兼得的机器学习 - 内容接宝可梦

本章提要 深度学习可以在较少参数量的情况下得到比较低的loss&#xff1a; h a l l a r g min ⁡ h ∈ H L ( h , D a l l ) h^{all}arg \min_{h \in H}L(h,D_{all}) hallargminh∈H​L(h,Dall​) 引入 如何权衡模型的复杂程度 Tradeoff of Model Complexity 理论上&#…

海康gdb流程

gdb相关 在initrun.sh文件里加入&#xff0c;注意需要在hikauto起来之前 # 设置core dump大小 ulimit -c unlimited if [ $? -eq 0 ];then echo "core dump size set success" else echo -e "\33[31m core dump size set fail\33[0m" fi echo …

springBoot统一响应类型3.3版本

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…

基于Linux下的MyBash命令解释器

项目介绍&#xff1a;⼀个⽤C语⾔实现的简单shell&#xff0c;可以接受⽤⼾输⼊的命令并执⾏操作&#xff0c;⽀持多管道和重 定向。 mybash---打造自己的命令解释器 目前我们Linux的系统默认的命令解释器是bash; 命令解释器&#xff08;也称为命令行解释器或shell&#xff0…

Ingredient-oriented Multi-Degradation Learning for Image Restoration论文阅读

摘要&#xff1a;重点在于关联多个任务本质的联系。 不同恢复任务的关联性很重要。 揭示退化现象的内在机理联系很有意义。 多合一的方法能在单一模型中处理多种退化问题&#xff0c;可扩展性较差。 成分导向范式挖掘不同图像退化现象背后的物理规律或特征模式。 成分导向退化重…

禅道后台命令执行漏洞

漏洞简介 禅道是第一款国产的开源项目管理软件。它集产品管理、项目管理、质量管理、文档管理、 组织管理和事务管理于一体&#xff0c;是一款专业的研发项目管理软件&#xff0c;完整地覆盖了项目管理的核心流程。 禅道管理思想注重实效&#xff0c;功能完备丰富&#xff0c;…

密码学——知识问答

目录 1、阐述公开密钥算法的定义&#xff0c;结合RSA算法说明公钥密码的基本要求。 说明公钥与私钥两种密码学并举例与其应用 1. 公钥密码学&#xff08;非对称加密&#xff09;&#xff1a; 2. 私钥密码学&#xff08;对称加密&#xff09;&#xff1a; 对比公钥与私钥密码…

海思烧录工具HITool电视盒子刷机详解

HiTool是华为开发的一款用于海思芯片设备的刷机和调试工具&#xff0c;可对搭载海思芯片的机顶盒、智能电视等设备进行固件烧录、参数配置等操作。以下为你详细介绍&#xff1a; 功能用途 固件烧录&#xff1a;这是HiTool最主要的功能之一。它能够将下载好的适配固件文件烧录到…

软考中级-软件设计师 23种设计模式(内含详细解析)

23种设计模式 &#x1f3af; 创建型设计模式&#x1f4cc; 抽象工厂&#xff08;Abstract Factory&#xff09; 设计模式&#x1f4cc; 工厂方法&#xff08;Factory Method&#xff09;设计模式&#x1f4cc; 单例&#xff08;Singleton&#xff09;设计模式&#x1f4cc; 生成…

软考笔记5——软件工程基础知识

第五章节——软件工程基础知识 软件工程基础知识 第五章节——软件工程基础知识一、软件工程概述1. 计算机软件2. 软件工程基本原理3. 软件生命周期4. 软件过程 二、软件过程模型1. 瀑布模型2. 增量模型3. 演化模型&#xff08;原型模型、螺旋模型)4. 喷泉模型5. 基于构建的开发…