我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

这篇“Java怎么自定义类加载器实现类隔离”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java怎么自定义类加载器实现类隔离”文章吧。

    一、背景

    某服务需要连接操作多种组件(每种组件可能有多个版本),如kafka、mongodb、es、mysql等等,并且后续需要适配更多的组件。

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

    主要难点:连接操作多组件多版本,且同种组件的不同版本所依赖的jar包可能不一样,操作源码也可能发生改变,项目无法直接依赖jar包,会产生类冲突

    二、解决思路

    由于每种组件的不同版本所依赖的jar包不同,我们可以借鉴tomcat的实现方式,通过自定义类加载器打破双亲委派机制来实现类隔离,从而达到操作多组件多版本的目的。

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

    2.1 创建依赖所在目录

    针对每一种组件我们创建一个目录,比如/data/kafka、/data/mongodb、/data/es等,且每种组件的不同版本创建对应的子目录,比如/data/kafka/0.10、/data/kafka/0.11,目录结构如下

    | ----/data
    | --------/kafka
    | ------------/0.10
    | ------------/0.11
    | --------/mysql
    | ------------/5.7
    | ------------/8.0
    | ...

    把每种组件不同版本对应的依赖包放在各个子目录下面。

    2.2 定义操作接口

    在common公共模块中定义一个接口AbstractOperator,该接口定义一些通用方法,如下:

    public interface Operator {        boolean testConnection(String connectionInfo);        String getVersion(String connectionInfo);}

    再定义各种组件的接口,如KafkaOperator、MysqlOperator等,使其继承该通用接口。组件接口内部包含一些组件自身的操作,如KafkaOperator中定义了getTopics、createTopic、deleteTopic等方法。代码如下:

    public interface KafkaOperator extends Operator{        List<String> getTopics(String connectionInfo);        boolean createTopic(String connectionInfo, String topic);        boolean deleteTopic(String connectionInfo, String topic);}

    2.3 编写并构建业务包

    大致步骤如下:

    针对每种组件的不同版本,可以在项目下新建一个模块,该模块依赖common公共模块

    创建入口类com.kamier.Entry(所有组件的不同版本的入口类的全限定名统一为com.kamier.Entry),并实现对应的组件接口,比如Kafka的0.10版本,那么就实现KafkaOperator接口。

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

    编写业务逻辑代码

    public class Entry implements KafkaOperator {    @Override    public List<String> getTopics(String connectionInfo) {        return null;    }    @Override    public boolean createTopic(String connectionInfo, String topic) {        return false;    }    @Override    public boolean deleteTopic(String connectionInfo, String topic) {        return false;    }    @Override    public boolean testConnection(String connectionInfo) {        return false;    }    @Override    public String getVersion(String connectionInfo) {        return null;    }}

    打成jar包

    将jar包放在对应的目录下,与依赖包同级,如/data/kafka/0.10

    2.4 自定义类加载器

    经过前面的准备工作,组件的每个版本的目录下都有了相应的依赖包和业务包。

    开始编写一个自定义类加载器继承URLClassLoader,重写loadClass方法,优先加载当前类加载器路径下的class来打破双亲委派模式,代码如下

    public static class MyClassLoader extends URLClassLoader {        public MyClassLoader(URL[] urls) {            super(urls);        }        public Class<?> loadClass(String name) throws ClassNotFoundException {            synchronized (getClassLoadingLock(name)) {                // 先检查当前类加载器是否已经装载该类                Class<?> c = findLoadedClass(name);                if (c == null) {                    try {                        // 在当前类加载器的路径下查找                        c = findClass(name);                    } catch (ClassNotFoundException e) {                        // 说明在当前类加载器的路径下没有找到                    }                    if (c == null) {                        // 走双亲委派机制                        if (getParent() != null) {                            c = getParent().loadClass(name);                        }                    }                }                return c;            }        }    }

    针对每种组件的不同版本,我们创建与其对应的自定义类加载器,并将该版本对应目录下的所有jar包(包括依赖包和业务包)的URL传入。

    2.5 主流程步骤

    步骤如下:

    当我们从页面上接收到一个获取Kafka(版本为0.10)topic列表的请求时,先判断是否已经初始化过Kafka(0.10版本)的类加载器,如果还未初始化,则进行类加载器的初始化

    URL[] urls = null;File dir = new File("/data/kafka/0.10");if (dir.isDirectory()) {    File[] files = dir.listFiles();    urls = new URL[files.length];    for (int i = 0; i < files.length; i++) {        urls[i] = files[i].toURL();    }}MyClassLoader contextClassLoader = new MyClassLoader(urls);

    通过类加载器加载入口类com.kamier.Entry并实例化,通过反射调用对应的方法(组件与其对应的方法列表可以统一维护在数据库中)。

    Class loadClass = contextClassLoader.loadClass("com.kamier.Entry");Object entry = loadClass.newInstance();Method method = loadClass.getDeclaredMethod("getTopics");List<String> a = (List) method.invoke(entry, 参数);

    获取到结果并返回。

    以上就是关于“Java怎么自定义类加载器实现类隔离”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

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

    这篇“Java怎么自定义类加载器实现类隔离”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java怎么自定义类加载器实现类隔离
    2023-07-05

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

    类隔离是一种通过类加载器实现加载所需类的实现方式,使得不同版本类间隔离,避免了使用冲突问题。本文将通过自定义的类加载器实现类隔离,感兴趣的可以了解一下
    2022-11-13

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

    由于每种组件的不同版本所依赖的jar包不同,我们可以借鉴tomcat的实现方式,通过自定义类加载器打破双亲委派机制来实现类隔离,从而达到操作多组件多版本的目的。本文就来和大家详细聊聊实现方法
    2023-03-02

    java自定义类加载器如何实现类隔离

    这篇文章主要介绍了java自定义类加载器如何实现类隔离问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-21

    Java中怎么实现类隔离加载

    Java中怎么实现类隔离加载,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一 什么是类隔离技术只要你 Java 代码写的足够多,就一定会出现这种情况:系统新引入了一个中间件
    2023-06-15

    java怎么自定义类加载器

    要自定义类加载器,可以按照以下步骤进行:1. 创建一个类,继承自java.lang.ClassLoader类,覆盖其中的findClass()方法。在findClass()方法中,根据自定义的类加载逻辑,加载指定的类文件并返回一个Class
    2023-09-14

    java类加载器怎么自定义

    要自定义Java类加载器,可以继承ClassLoader类,并重写它的findClass()方法。下面是一个简单的示例:```javapublic class MyClassLoader extends ClassLoader {@Over
    2023-09-14

    怎么在java中自定义一个类加载器

    本篇文章为大家展示了怎么在java中自定义一个类加载器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。如果要使用自定义类加载器加载class文件,就需要继承java.lang.ClassLoader类
    2023-05-30

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

    这篇文章主要介绍了Java中如何自定义一个类加载器,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-21

    java怎么自定义标签实现类

    要自定义一个标签实现类,需要按照以下步骤进行操作:创建一个类,该类需要实现javax.servlet.jsp.tagext.Tag接口或其子接口,如javax.servlet.jsp.tagext.SimpleTag或javax.servl
    java怎么自定义标签实现类
    2023-10-28

    Java自定义类加载器及JVM自带的类加载器之间的交互关系是什么

    这篇“Java自定义类加载器及JVM自带的类加载器之间的交互关系是什么”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“Java自定义类加载器及JVM自带的类加载器之间的交互关系是什么”,小编整理
    2023-06-06

    Java中的异常类怎么实现自定义

    Java中的异常类怎么实现自定义?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java自定义异常类的实例详解为什么要自己编写异常类?假如jdk里面没有提供的异常
    2023-05-31

    python怎么实现自定义异常类

    本篇内容介绍了“python怎么实现自定义异常类”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明通常可以继承Exception或子类。命名
    2023-06-30

    Android中怎么通过自定义view实现进度条加载效果

    Android中怎么通过自定义view实现进度条加载效果,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。分析图:代码如下:package com.example.dotloa
    2023-05-30

    c# WPF中自定义加载时怎么实现带动画效果的Form和FormItem

    本篇内容主要讲解“c# WPF中自定义加载时怎么实现带动画效果的Form和FormItem”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c# WPF中自定义加载时怎么实现带动画效果的Form和F
    2023-06-07

    怎么在Java中利用AQS实现一个自定义同步器

    这篇文章主要为大家详细介绍了怎么在Java中利用AQS实现一个自定义同步器,文中示例代码介绍的非常详细,具有一定的参考价值,发现的小伙伴们可以参考一下:Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,
    2023-06-06

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录