自定义类加载器加载冲突类(一)-ClassLoader

利用自定义类加载器和jar包冲突说拜拜 在软件开发过程中,常常会遇到不同jar包之间的冲突。这种冲突可能会导致程序无法正常运行,甚至出现意想不到的错误。解决jar包冲突是开发过程中不可避免的重要环节,需要开发人员具备一定的经验和技巧。本文将就jar包冲突的产生原因、解决方法以及预防措施进行探讨,希望能为开发人员在遇到jar包冲突时提供一些指导和帮助。此段为AI小作文。 阅读详情

使用场景:项目中遇到使用不同版本的类时候因为同路径同名类的冲突可以使用自定义类加载器进行加载规避这一问题

相关代码如下:

代码

1. 类加载器:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * @Description TODO
 * @Date 2020/3/10 15:05
 * @Created by hzhu
 */
public class MyClassLoader extends ClassLoader {

    public MyClassLoader() {
    }

    public MyClassLoader(ClassLoader parent) {
        super(parent);
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        File file = new File("F:\\javaworkspace\\baseplat\\Car.class");
        try {
            byte[] classBytes = getContent(file);
            Class<?> aClass = this.defineClass(name, classBytes, 0, classBytes.length);
            return aClass;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 读取class文件
     * @param file
     * @return
     * @throws Exception
     */
    private byte[] getContent(File file) throws Exception {
        long length = file.length();
        if (length > Integer.MAX_VALUE) {
            throw new RuntimeException("文件太大!");
        }
        FileInputStream fis = new FileInputStream(file);
        byte[] buffer = new byte[(int)length];
        int offset = 0;
        int num = 0;
        while (offset < buffer.length && (num = fis.read(buffer, offset, buffer.length - offset)) >= 0) {
            offset += num;
        }

        if (offset != buffer.length) {
            throw new IOException("无法完全读取");
        }
        fis.close();
        return buffer;
    }
}

2. 使用示例

public class Demo {

    public static void main(String[] args) {
        MyClassLoader loader = new MyClassLoader();
        try {
            Class<?> aClass = Class.forName("Car", true, loader);
            Object o = aClass.newInstance();

            System.out.println(o);
            System.out.println(o.getClass().getClassLoader());

            Method method = o.getClass().getDeclaredMethod("getName");
            Object invoke = method.invoke(o);
            System.out.println(invoke);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

局限

但是该方法对于整个jar包的加载及有依赖的方法调用情况下有很大局限,因此可以使用URLClassLoader进行加载

参考

自定义类加载器加载冲突类(二)-URLClassLoader

ClassLoader(类加载器)详解jvm ClassLoader(类加载器)在Java中是一个抽象类,负责在运行时动态加载类,并确保类的唯一性和隔离性。 阅读详情

相关推荐

在mac OS下安装SQL Developer

最近一直在折腾Oracle数据库,但由于电脑是mac系统,plsql developer用不了,远程管理一直不是很方便。后来听说Navicat不错,就也装了个试试看,发现界面看起来确实不错。今天心血来潮,想试试oracle自己开发的client。用惯plsql developer的人也可以来试试看,毕竟是自己人开发的,兼容性应该会不错吧。下面就把安装过程分享给新手或者需要帮助的朋友。 1.

bonbonboo的专栏 2万+

两个jar包冲突但两个都要使用的解决方案

两个jar包冲突但两个都要使用的解决方案方案一 使用URLClassLoader加载jar包这样就与冲突jar包隔离开了。方案二 可以去找到jar包的源码修改报名然后放在自己的工程里或在打个jar包引入项目方案三 如果找不到jar包源码那就反编译 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 方案一 使用URLClassLoader加载jar包这样就与冲突jar包隔离开了。 使用

shixiaodongmain的博客 6476

手把手教你用STM32F429+FreeRTOS搭建开源SIP电话(附代码与避坑指南)

本文详细介绍了如何使用STM32F429和FreeRTOS搭建开源SIP电话系统,涵盖硬件选型、FreeRTOS任务划分、PJSIP协议栈移植、音频系统优化及安全实践。通过实战案例和代码示例,帮助开发者快速实现嵌入式VoIP通信,特别适合物联网和音视频通信领域的应用开发。

weixin_33582311的博客 358

重新看待Jar包冲突问题及解决方案

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33881140的博客 814

非sudo用户如何安全使用Docker:Rootless模式实战指南

Docker Rootless模式是一种基于Linux用户命名空间(userns)的容器运行时安全机制,它通过UID/GID映射、fuse-overlayfs文件系统和slirp4netns网络栈,在不提升权限的前提下实现容器隔离。其核心原理是将容器内root身份映射为宿主机非特权用户,从而规避docker组等价root的安全风险。相比传统root模式,Rootless在权限控制、逃逸防护和多租户隔离方面具备天然优势,适用于CI/CD流水线、Kubernetes边缘节点及受限生产环境。本文聚焦无sudo权限

weixin_30274627的博客 351

python 爬取携程全国旅游景点信息-2024.4.13

携程网是中国领先的在线旅行服务公司,提供酒店预订、机票预订、旅游度假、商旅管理等服务。携程网上有大量的旅游景点和酒店信息,这些信息对于旅行者和旅游业者都有很大的价值。通过爬虫技术,我们可以从携程网上获取这些信息,并进行数据清洗、数据分析、数据可视化等操作,从而得到有用的洞察和建议。

britlee的博客 1万+

使用自定义classloader解决web工程的jar包冲突问题

1)起因在使用tomcat7工程时,需要生成word文件并下载,预使用poi3.x的jar包完成相关功能。但是web工程中已经有了poi2.x的jar包,poi2.x的jar包被extremetable表格类控件使用,且不能用poi3.x代替。这两个jar包相互冲突,web工程不可用。2)使用自定义classloader加载不同的jar包解决冲突考虑到word文件生成功能使用不频繁,自定义clas...

lao_pei的专栏 2338

如何使用 Python 爬取 58 同城招聘信息

职位名称:招聘的岗位名称,如“前端开发”、“数据分析师”等。公司名称:招聘公司的名称。薪资待遇:职位的薪资范围,通常以“面议”、“10k-20k”这样的形式表示。工作地点:公司所在的城市及具体地址。公司福利:例如五险一金、带薪年假、绩效奖金等。发布时间:职位信息的发布时间。一个典型的招聘页面 URL 格式通常如下:在这个页面上,职位信息会分页展示,爬虫需要模拟翻页,获取多个页面的招聘信息。

2201_76125261的博客 1291

jar包冲突之URLClassLoader加载指定jar

Jar包冲突之URLClassLoader加载指定jarJar包冲突场景Jar包冲突解决解决方案一解决方案二解决方案三解决方案四总结 Jar包冲突场景 最近项目中用到了SM4加密,发现 bcprov-jdk15on-1.59.jar 和 BJCA-JCE2.jar 两个jar包中存在有两个包路径相同的类: import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex;

Nirvana_lss的博客 2821

uniapp | 基于高德地图实现位置选择功能(安卓端)

在uni-app项目中实现地图位置选择功能的解决方案。由于uni.chooseLocation功能受限,采用高德地图API自主开发。系统由父组件poiMap.vue(负责展示和跳转)和子组件poiBox.vue(核心地图逻辑)构成,通过父子组件通信传递位置数据。关键技术包括:1)使用AMapLoader动态加载地图SDK;2)集成PositionPicker实现拖拽选点;3)异步加载AMapUI插件;4)通过事件监听获取位置详情(地址/经纬度)。

大胆尝试,小心实践 734

【Unity】【WebRTC】如何用Unity而不是浏览器接收远程画面

之前几篇我们讨论了如何设置信令服务器,如何发送画面给远端以及如何用浏览器查看同步画面,今天来讨论如何实现Unity内部接收画面。看本篇之前请先看过之前将web服务器设置和基本远程画面功能的几篇博文。在Unity编辑器中打开一个示例项目,点击BroadCast按钮。4. 再点击Receiver按钮,Start。Build一个示例项目,并运行这个项目。启动Web.app。

每日出拳老爷子的博客 1721

Java自定义Class加载顺序

[size=medium] 思路一 :打破双亲加载 1、在Java中默认的Class加载顺序都是父类委托加载,但是有些时候需要自定义加载顺序比如OSGI和ali的Pandora。 2、父类委托加载的基本实现思路,loadClass中在parent中查找class,要是不存在parent则使用findBootstrapClassOrNull调用native方法,要是找不到,使用其中find...

canxingfly的博客 685

LLC设计指南(一)第一章:别一上来就背公式,先把 LLC 的“脾气”摸清楚

很多工程师第一次学 LLC,都会有一种感觉:这个电源拓扑,好像不是在工作,而是在“跳舞”。Buck 很直观,开关一开,电感充电;开关一关,电感放电。Flyback 也好理解,先存能量,再把能量丢给副边。但 LLC 不一样。它不是硬邦邦地把能量“推过去”,而是让电感、电容、变压器一起形成一个谐振网络,让能量在里面来回摆动。控制器再通过调节开关频率,把这个摆动过程“驯服”成稳定输出。这也是 LLC 最迷人的地方:🎯。

weixin_43199439的博客 319

jvm之java类加载机制和类加载器(ClassLoader)的详解

当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。 一、类加载过程 1.加载 加载指的是将类的class文件...

翻过一座座山 22万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

用自定义类加载器实现Java类隔离

类隔离就是让不同模块的jar包用不同的类加载器加载,要做到这一点,就需要让JVM能够使用自定义的类加载器加载我们写的类以及其关联的类。

Hopefully Sky的博客 4556

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java 中如何自定义一个类加载器,加载自己指定的类?

在很多场景下,自定义类加载器非常有用。插件系统:在应用运行时动态加载某些功能模块。热部署:更新类文件后,不用重启应用就能加载新版本的类。隔离加载:可以让同一个类库在不同的模块中加载多次,避免类冲突。假设我们有一个文件存放在目录下。我们可以用来加载这个类并使用它。try {// 加载 com.example.HelloWorld 类Class

龚小帅的博客 2617

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java类加载器 — classloader 的原理及应用

什么是classloaderclassloader顾名思义,即是类加载。虚拟机把描述类的数据从class字节码文件加载到内存,并对数据进行检验、转换解析和初始化,最终形成可以被虚拟机直接使...

淘系技术 6489

Java JVM:自定义类加载器原理与应用

在当今的软件开发领域,Java虚拟机(JVM)作为Java程序运行的核心环境,其内部机制对于理解Java程序的行为至关重要。在众多JVM的核心知识点中,自定义类加载器是一个不容忽视的部分。想象一下,在一个大型企业级应用中,类加载器负责将Java类文件加载到JVM中,以供程序使用。然而,当系统需要处理特定类型的类文件,或者需要隔离类加载环境以避免类之间的冲突时,标准类加载器可能无法满足需求。自定义类加载器应运而生,它允许开发者根据特定的需求,自定义类加载逻辑。

我是Java程序员廖志伟,感谢朋友们的支持! 1054

Java类加载器-ClassLoader

1、ClassLoader用来加载class字节码文件,生成类对象。 2、系统内置的ClassLoader通过双亲委托机制来加载指定路径下的class和资源。 3、ContextClassLoader与线程相关,可以获取和设置类加载器。 4、灵活运行自定义ClassLoader,可以解决类冲突问题,实现热加载以及热部署,甚至可以实现jar包的加密保护。

weixin_40017062的博客 2077

自定义child-first类加载器解决Jar包冲突

自定义java类加载器解决Jar包冲突 最新使用tika进行非结构化数据的抽取,因为现场抽取的种类很多,针对EXCLE数据,需要引用到poi-ooxml中的方法,但是现场的poi-ooxml的版本和tika-app中依赖的版本有冲突,因此需要解决该问题。 概念 此处来源 https://www.jianshu.com/p/1e4011617650 BootstrapClassLoader(启动类加载器) c++编写,加载java核心库 java.*,构造ExtClassLoader和AppClas

lilyjoke的专栏 2518

Java中如何去自定义一个类加载器

官方给的回答是:为 Java 应用程序提供更加灵活和可定制的类加载机制,并实现类的隔离。1、拓展加载源其实JVM除了能加载咱们本地编译好的class文件外,还可以加载其他来源的class文件,比如可以从网络、数据库等地方加载类。2、实现类隔离具体来说就是,自定义类加载器可以实现类隔离,避免类之间的冲突和干扰,这个在tomcat里就有大量的应用。注意:比较两个类是否相等,只有两个类是由同一个类加载器加载的前提下才有意义,否则即使两。

曹举的个人博客 1231

Java类加载器ClassLoader

Java类加载器ClassLoader

雷神乐乐的博客 1451
上一篇: 深入理解 HashMap put 方法(JDK 8逐行剖析)
下一篇: Canal问题归纳
pp_lan
博客等级 码龄10年 419粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值