当前位置: 首页 > news >正文

自定义类加载器国密版本冲突

自定义类加载器国密版本冲突

对接三方接口经常使用到国密加密包(bcprov),此时系统已经引入了1.5版本,而三方提供的sdk中引用了1.6版版本,两个版本有冲突,如果系统加载到1.5版本的将会加密异常(各种奇怪的异常),本文的解决方案是指定一个类加载器,完成指定加载sdk和1.6版本的加密包

自定义类类加载器

package com.huakai.springenv.config.test;
 
import java.net.URL;
import java.net.URLClassLoader;
 
public class IsolatedClassLoader extends URLClassLoader {
 
    private final ClassLoader parent;
 
    public IsolatedClassLoader(URL[] urls, ClassLoader parent) {
        super(urls, parent);
        this.parent = parent;
    }
 
    @Override
    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        synchronized (getClassLoadingLock(name)) {
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                try{
                    c = this.findClass(name);
                }catch (Exception e){
 
                }
 
                if (c == null) {
                    try {
                        c = this.parent.loadClass(name);
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    }
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }
}

使用sdk

    private  OpenBankHttpClient getOpenBankHttpClient() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, IOException {
    	// 指定版本的加密包
        URL urlbc = AbcMarketingConfig.class.getClassLoader().getResource("./abc/bcprov-jdk15on-1.68");
        // 三方sdk
        URL urlSM2SdkImpl = AbcMarketingConfig.class.getClassLoader().getResource("./abc/openbank-sdk-java-sm");
        URL[] urls= new URL[] {urlbc,urlSM2SdkImpl};
        IsolatedClassLoader sdkClassLoader = new IsolatedClassLoader(urls, AbcMarketingConfig.class.getClassLoader());
        // 使用自定义类加载器加载三方SDK的主类
        Class<?> requestParamsClass = sdkClassLoader.loadClass("com.abchina.openbank.OpenBankHttpClient");
        // 获取私有构造函数
        Constructor<?> constructor = requestParamsClass.getDeclaredConstructor();
        // 设置构造函数可访问
        constructor.setAccessible(true);
        // 使用构造函数创建对象
        return (OpenBankHttpClient) constructor.newInstance();
    }

相关文章:

  • GD32F450 使用
  • 安装2018版本的petalinux曲折经历
  • C++ unordered_set、unordered_map哈希使用及其封装
  • 在Docker中部署DataKit最佳实践
  • P4V的相关操作
  • Flink同步数据mysql到doris问题合集
  • 【大模型】大模型分类
  • 【六祎 - Note】消息队列的演变,架构图;备忘录; IBM MQ,RabbitMQ,Kafka,Pulsar
  • 蓝桥杯好题推荐----高精度乘法
  • AI DEV 人工智能能做的工作,在开发运维安全方面以及企业成本降低方面所起的作用和相应的提示词。
  • harbor拉取全部镜像
  • PyCharm怎么集成DeepSeek
  • 武汉大学生命科学学院与谱度众合(武汉)生命科技有限公司举行校企联培座谈会
  • RabbitMQ快速入门
  • Linux基础知识点总结
  • 【漫话机器学习系列】110.线性可分(Linearly Separable)
  • 地弹与振铃
  • 不同数据类型在数据库和编程语言之间的对应关系表
  • log4j2中<logger>中没有指定appender的输出
  • css的元素显示模式
  • 上海模板网站制作多少钱/个人怎么做网站
  • 网站后台链接怎么做/东莞网络营销全网推广
  • 搜索网站做推广/seo站内优化最主要的是什么
  • 网站开发多少钱一天是/百度关键词热搜
  • 做网站应该会什么问题/seo点击软件排名优化
  • 网站建设的步骤教学/南京 seo 价格