【JVM】打破双亲委派机制

news2025/1/31 3:15:37

       📝个人主页:五敷有你      

 🔥系列专栏:JVM

⛺️稳中求进,晒太阳

打破双亲委派机制

打破双亲委派机制三种方法

自定义类加载器

ClassLoader包含了四个核心方法

//由类加载器子类实现,获取二进制数据调用defineClass,比如URLClassLoader会根据文件路径去获取类文件中的二进制文件
(不想打破就重写它)
public Class<?> findClass(String name) 
//类加载的入口,提供了双亲委派机制,内部会调用findClass(打破双亲委派,就重写它)
protected Class<?> loadClass(String name) 
//做一些类名的校验,然后调用虚拟机底层方法将字节码信息加载到虚拟机内存中
protected final Class<?> defineClass(String name,byte[] b,int off,int len)
//执行类生命周期的连接阶段
protected final void resolveClass(Class<?> c)

双亲委派机制核心代码阅读

阅读双亲委派机制的核心代码,分析如何通过自定义类加载器打破双亲委派机制。

打破双亲委派机制的核心就是讲下面的代码重写

思考

问题一:

自定义类加载器的父类怎么是AppClassLoader呢?

以Jdk8为例,ClassLoader类中提供了构造方法设置parent的内容:

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

问题2

两个自定义类加载器加载相同限定名的类,不会冲突吗?

不会冲突,在同一个Java虚拟机中,只有相同类加载器+相同的类限定名才会被认为是同一个类。

在Arthas中使用sc –d 类名的方式查看具体的情况

线程上下文类加载器(JDBC案例)

JDBC中使用了DriverManager来管理项目中的不同数据库的驱动,比如mysql驱动,oracle驱动

DrvierManager类位于rt.jar包中,由启动类加载器加载

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

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

思考

DriverManager怎么知道jar包中要加载的驱动在哪里?

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

SPI机制

SPI全称(Service Provider Interface)是JDK内置的服务提供发现机制。

工作原理
  1. 在ClassPath路径下的META-INF/services文件夹中(路径是固定的SPI机制会扫描这个文件夹),以接口的全限定名来命名文件名,对应的文件里面写接口的实现
  2. 在使用ServiceLoader加载实现类

总结
  • 启动类加载器加载DriverManager
  • 在初始化DriverManager时,通过SPI机制加载Jar包中的mysql驱动
  • SPI中利用线程上下文类加载器(应用程序类加载器) 去加载并创建对象。

OSGi模块化

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

热部署指的是在服务器不停止的情况下,动态的更新字节码文件到内存中

案例:

使用arthas不停机解决线上问题

背景:小李的团队将代码上线后,发现bug,但用户着急使用,如果重新打包在发布需要一个多小时的时间,所以希望使用arthas尽快解决问题

思路:

  1. 在出问题的服务上部署一个arthas并启动。
  2. jad(反编译) --source-only 类全限定名 > 目录/文件名.java
    1. jad 命令 反编译,然后可以用其他编辑器修改源码(比如Vim)
  3. mc -c 类加载器的hashcode 目录/文件名.java -d 输出目录
    1. mc 命令用来编译修改过的代码。
  4. retransform class 文件所在目录/xxx.class
    1. retransform命令加载新的字节码

注意:

  1. 只是暂时更新到内存中,程序重启后,字节码文件会恢复,除非将class文件放入jar包更新,
  2. 使用retransform不能添加方法或字段,也不能更新正在执行的方法

JDK9之后的类加载器

JKD8及之前的版本,扩展类加载器和应用程序类加载器的源码位于rt.jar包中的sun.misc.Launcher.java中

JDK9引入了module的概念,类加载器在设计上发生很大变化

  1. 启动类加载器使用Java编写,位于jdk.internal.loader.ClassLoaders类中。
    1. Java中的BootClassLoader继承自BuiltinClassLoader实现从模块中找到要加载的字节码资源文件。
    2. 启动类加载器依然无法通过java代码获取到,返回的仍然是null,保持了统一

  1. 扩展类加载器被替换成了平台类加载器(Platform Class Loader)。

平台类加载器遵循模块化方式加载字节码文件,所以继承关系从URLClassLoader变成了BuiltinClassLoader,BuiltinClassLoader实现了从模块中加载字节码文件。平台类加载器的存在更多的是为了与老版本的设计方案兼容,自身没有特殊的逻辑。

总结

1、类加载器的作用是什么?

类加载器(ClassLoader)负责在类加载过程中的字节码获取并加载到内存这一部分。通过加载字节码数据放入内存转换成byte[],接下来调用虚拟机底层方法将byte[]转换成方法区和堆中的数据

2、有几种常见的类加载器?

1.启动类加载器(Bootstrap ClassLoader)加载核心类

2.扩展类加载器(Extension ClassLoader)加载扩展类

3.应用程序类加载器(Application ClassLoader)加载应用classpath中的类

4.自定义类加载器,重写findClass方法。JDK9及之后扩展类加载器(Extension ClassLoader)变成了平台类加载器(PlatformClassLoader)

3、什么是双亲委派机制?

每个Java实现的类加载器中保存了一个成员变量叫“父”(Parent)类加载器。自底向上查找是否加载过,再由顶向下进行加载。避免了核心类被应用程序重写并覆盖的问题,提升了安全性。

4、怎么打破双亲委派机制?

1、重写loadClass方法,不再实现双亲委派机制。

2、JNDI、JDBC、JCE、JAXB和JBI等框架使用了SPI机制+线程上下文类加载器。

3、OSGi实现了一整套类加载机制,允许同级类加载器之间互相调用。

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

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

相关文章

安装cockpit

1、下载cockpit yum -y install cockpit 下载相关环境 yum install qemu-kvm libvirt libvirt-daemon virt-install virt-manager libvirt-dbus 2、启动libvirtd systemctl start libvirtd.service systemctl enable libvirtd.service 3、设置开机自启动 systemctl enabl…

高程 | 继承与派生(c++)

文章目录 &#x1f4da;继承的概念和语法&#x1f4da;派生类生成过程&#x1f4da;继承权限和继承方式&#x1f407;公有继承&#x1f407;私有继承&#x1f407;保护继承 &#x1f4da;类型转换规则&#x1f4da;派生类构造函数和析构函数&#x1f4da;继承中的静态成员特性&…

并发编程之深入理解JVM并发三大特性

并发编程之深入理解JVM&并发三大特性 并发编程解决的问题 ​ 多线程同步&#xff08;一个线程需要等待另一个线程的结果&#xff0c;一个线程依赖于另一个线程&#xff09;&#xff0c;互斥&#xff08;一个资源只能一个线程使用&#xff09;&#xff0c;分工&#xff08…

华为配置直连二层组网隧道转发示例

配置直连二层组网隧道转发示例 组网图形 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户通过WLAN接入网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff0c;不影响用户的业务使用。 组网需求 AC组…

Open CASCADE学习|布尔运算

目录 1、加法&#xff1a;BRepAlgoAPI_Fuse 2、减法&#xff1a;BRepAlgoAPI_Cut 3、交集&#xff1a;BRepAlgoAPI_Common 4、交线&#xff1a;BRepAlgoAPI_Section 1、加法&#xff1a;BRepAlgoAPI_Fuse #include <gp_Pnt.hxx>#include <BRepPrimAPI_MakeBox.hxx…

计算机网络-数据通信基础

目录 前言 一、数据通信基本概念 二、数据通信相关知识1 总结 前言 正在学习计算机网络体系&#xff0c;把每日所学的知识梳理出来&#xff0c;既能够当作读书笔记&#xff0c;又能分享出来和大家一同学习讨论。 一、数据通信基本概念 基本概念&#xff1a;信源、信道、信宿&…

怎么防止u盘里的东西被拷贝?

随着科技的进步&#xff0c;U盘作为便携式存储设备&#xff0c;在我们的日常工作和生活中扮演着越来越重要的角色。然而&#xff0c;这也带来了一个潜在的安全风险——U盘内的数据可能被未经授权的人员拷贝。 一、了解U盘拷贝数据的常见方式 在探讨如何防止U盘数据被拷贝之前&…

setTimeout及setInterval

setTimeout用法&#xff1a; 过100ms调用函数 setTimeout((a) > {console.log(111,a);}, 100,我是定时器); 参数&#xff1a; 第一个参数&#xff1a;必填&#xff0c;回调函数&#xff1b; 第二个参数&#xff1a;可选&#xff0c;延迟时间&#xff0c;单位ms 第三个参…

Apache Httpd 常见漏洞解析(全)

一、Apache HTTPD 换行解析漏洞 漏洞编号&#xff1a;CVE-2017-15715 Apache HTTPD是一款HTTP服务器&#xff0c;它可以通过mod_php来运行PHP网页。 其2.4.0~2.4.29版本中存在一个解析漏洞。 在解析PHP时&#xff0c;1.php\x0A将被按照PHP后缀进行解析&#xff0c;导致绕过…

springboot第56集:微服务框架,物联网IOT,SQL数据库MySQL底层,AOP收集业务操作日志架构周刊...

单点登录 1.配置代理信息 /*请求登陆的方法*/ "/modelLogin": {//本地服务接口地址&#xff0c;这是测试环境&#xff0c;正式环境需要更改下地址target: "http://127.0.0.1:6776/xxx-auth/",changeOrigin: true,pathRewrite: {"^/modelLogin": …

MATLAB知识点:ismembertol函数(★★☆☆☆)考虑了一定的容差的ismember函数

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第三…

人工智能学习与实训笔记(八):百度飞桨套件使用方法介绍

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 八、百度飞桨套件使用 8.1 飞桨预训练模型套件PaddleHub 8.1.1 一些本机CPU可运行的飞桨预训练简单模型&#xff08;亲测可用&#xff09; 8.1.1.1 人脸检测模型 8.1.1.2 中文分词模型 8.1…

【开源】SpringBoot框架开发创意工坊双创管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员端2.2 Web 端2.3 移动端 三、系统展示四、核心代码4.1 查询项目4.2 移动端新增团队4.3 查询讲座4.4 讲座收藏4.5 小程序登录 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的创意工坊双创管理…

Portraiture插件2024官方版功能主要介绍

Portraiture插件的功能主要包括&#xff1a; 一键平滑处理&#xff1a;可以对眉毛、头发等毛发材质进行一键平滑处理&#xff0c;使其质感显得更加光鲜亮丽。同时&#xff0c;这种处理还能保证原有图像的画质。使用吸管工具添加肤色蒙版&#xff1a;这个工具可以吸取人物面部的…

php基础学习之匿名函数

匿名函数 描述 允许临时创建一个没有指定名称的函数&#xff0c;使用匿名函数可以方便地创建一次性或临时的功能块。 语法 function (){ //函数体 }; 样例 &#xff08;注&#xff1a;匿名函数定义后&#xff0c;需要将其赋值给一个变量&#xff0c;然后通过该变量来调用 这种调…

【BUG】段错误

1. 问题 8核工程&#xff0c;核4在运行了20分钟以上&#xff0c;发生了段错误。 [C66xx_4] A00x53 A10x53 A20x4 A30x167e A40x1600 A50x850e2e A60x845097 A70xbad9f5e0 A80x0 A90x33 A100x53535353 A110x0 A120x0 A130x0 A140x0 A150x0 A160x36312e35 A170x20 A180x844df0 …

15-树-路径总和

这是树的第15篇算法&#xff0c;力扣链接。 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff…

C++学习Day05之强化训练---数组类封装

目录 一、程序及输出1.1 数组类头文件1.2 数组类.cpp1.3 主程序 二、分析与总结 一、程序及输出 1.1 数组类头文件 myArray.h #include<iostream> using namespace std;class MyArray { public:MyArray(); //默认构造 可以给100容量MyArray(int capacity); //有参构造…

OpenAI全新发布的Sora,到底意味着什么?

16日凌晨&#xff0c;OpenAI发布了文本视频的工具&#xff08;text-do-video&#xff09;Sora&#xff0c;整个世界再次被震撼。 Sora的出现&#xff0c;到底意味着什么&#xff1f; 目录 Sora的背景与概述Sora是什么&#xff1f;能为我们做些什么&#xff1f;存在的一些问题 文…

目前2024年4核8G云服务器租用价格,阿里云PK腾讯云

4核8G云服务器多少钱一年&#xff1f;阿里云ECS服务器u1价格955.58元一年&#xff0c;腾讯云轻量4核8G12M带宽价格是646元15个月&#xff0c;阿腾云atengyun.com整理4核8G云服务器价格表&#xff0c;包括一年费用和1个月收费明细&#xff1a; 云服务器4核8G配置收费价格 阿里…