什么是双亲委派?如何打破双亲委派?

简介: 什么是双亲委派?如何打破双亲委派?

1 双亲委派(又称双亲委托)

作用:保证类加载的有序性和安全性

类加载器的分类:

网络异常,图片无法展示
|


作用:保证JVM的核心类和用户的类都能得到正常加载

双亲委派机制:

向上委派:当类加载器加载一个类时,首先会向他的父类加载器进行委派,直到启动类加载器。

网络异常,图片无法展示
|


向下委派:当启动类加载器发现自己无法加载这个类时,会委派给他的子类加载器进行加载,如果直到最后一个子类还不能加载,就抛出ClassNotFound异常。

网络异常,图片无法展示
|


2 如何打破双亲委派

两个典型的方法:

  • 自定义类加载器,重写loadClass方法
  • 使用线程上下文类加载器

2.1 重写loadClass方法

因为双亲委派机制的实现都是通过这个方法实现的,这个方法可以指定类通过什么加载器来进行加载,所以如果我

们改写他的加载规则,就相当于打破了双亲委派机制。默认的过程是这样的,先判断这个类是不是已经被当前层的

类加载器加载过了,如果没有加载过就就将该类委派给父类加载器,如果父加载器无法加载再向下传递,回来由自

己来进行加载,重写了这个方法以后就能自己定义使用什么加载器了,也可以自定义加载委派机制,也就打破了双

亲委派模型。

重写loadClass()方法也就有可能连带把findClass(方法也重写。

2.2 线程上下文类加载器

线程上下文类加载器(Thread Context ClassLoader)。这个类加载器可以通过java.lang.Thread类的

setContextClassLoader()方法进行设置,如果创建线程时还未设置,他将会从父线程中继承一个,如果在应用程序

的全局范围内都没有设置过的话,那这个类加载器默认就是应用程序类加载器。

有了线程上下文加载器,JNDI服务就可以使用它去加载所需要的SPI代码,也就是父类加载器请求子类加载器去完

成类加载的动作,这种行为实际上就是打通了双亲委派模型层次结构来逆向使用类加载器,实际上已经违背了双亲

委派模型的一般性原则,但这也是无可奈何的事情。Java中所有涉及SPI的加载动作基本上都采用这种方式,例如

JNDI、JDBC、JCE、JAXB和JBI等。


相关文章
|
Java 关系型数据库 MySQL
【JVM】JDBC案例打破双亲委派机制
【JVM】JDBC案例打破双亲委派机制
348 4
|
3月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
1304 0
|
消息中间件 安全 Kafka
Kafka保证消息不丢失不重复
Kafka保证消息不丢失不重复
333 6
|
8月前
|
存储 Java
【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读
前言 下面,跟上主播的节奏,马上开始ThreadLocal源码的阅读( ̄▽ ̄)" 内部结构 如下图所示,我们可以知道,每个线程,都有自己的threadLocals字段,指向ThreadLocalMap
541 81
【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读
|
缓存 Java 关系型数据库
【Java面试题汇总】ElasticSearch篇(2023版)
倒排索引、MySQL和ES一致性、ES近实时、ES集群的节点、分片、搭建、脑裂、调优。
【Java面试题汇总】ElasticSearch篇(2023版)
|
机器学习/深度学习 算法 TensorFlow
深度学习基础:神经网络原理与构建
**摘要:** 本文介绍了深度学习中的神经网络基础,包括神经元模型、前向传播和反向传播。通过TensorFlow的Keras API,展示了如何构建并训练一个简单的神经网络,以对鸢尾花数据集进行分类。从数据预处理到模型构建、训练和评估,文章详细阐述了深度学习的基本流程,为读者提供了一个深度学习入门的起点。虽然深度学习领域广阔,涉及更多复杂技术和网络结构,但本文为后续学习奠定了基础。
559 5
|
XML Java Maven
Springboot Starter 是如何工作的?
Springboot Starter 是 Springboot 项目的一部分,简化了依赖管理和自动配置,通过 Maven 或 Gradle 引入相关依赖并自动配置应用程序。其核心特性包括依赖管理、自动配置及条件注解。Starter 的设计思维体现了模块化、约定优于配置、依赖注入等原则,提高了开发效率,但也存在调试复杂、过度依赖等问题。
500 3
|
数据采集 Web App开发 数据处理
一步步教你用Python Selenium抓取动态网页任意行数据
使用Python Selenium爬取动态网页,结合代理IP提升抓取效率。安装Selenium,配置代理(如亿牛云),设置User-Agent和Cookies以模拟用户行为。示例代码展示如何使用XPath提取表格数据,处理异常,并通过隐式等待确保页面加载完成。代理、模拟浏览器行为和正确配置增强爬虫性能和成功率。
2001 3
一步步教你用Python Selenium抓取动态网页任意行数据
|
监控 安全 数据安全/隐私保护
确保数据安全与隐私保护的数据治理最佳实践
【8月更文第13天】随着数据成为企业最重要的资产之一,数据安全和隐私保护变得至关重要。本文将探讨数据治理中的一些最佳实践,并提供具体的代码示例来说明如何实施这些策略。
2556 4
|
移动开发 监控 网络协议
在Linux中,如何查看 http 的并发请求数与其 TCP 连接状态?
在Linux中,如何查看 http 的并发请求数与其 TCP 连接状态?