广告
返回顶部
首页 > 资讯 > 精选 >Java怎么自定义类加载器实现类隔离
  • 183
分享到

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

2023-07-05 08:07:08 183人浏览 八月长安
摘要

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

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

    一、背景

    某服务需要连接操作多种组件(每种组件可能有多个版本),如kafkamongodb、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怎么自定义类加载器实现类隔离”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

    --结束END--

    本文标题: Java怎么自定义类加载器实现类隔离

    本文链接: https://www.lsjlt.com/news/350479.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

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

    下载Word文档
    猜你喜欢
    • Java怎么自定义类加载器实现类隔离
      这篇“Java怎么自定义类加载器实现类隔离”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java怎么自定义类加载器实现类隔离...
      99+
      2023-07-05
    • Java通过自定义类加载器实现类隔离
      目录前言类隔离是什么使用场景解决方案重写findClass重写loadClass总结前言 由于微服务的快速迭代、持续集成等特性,越来越多的团队更倾向于它。但是也体现出了一些问题,比如...
      99+
      2022-11-13
      Java 类加载器 类隔离 Java 类加载器 Java 类隔离
    • java自定义类加载器如何实现类隔离
      目录自定义类加载器准备通过URLClassLoader来实现【推荐】通过继承ClassLoader实现网上java自定义类加载器很多容易找到,但是都是加载的单个类,如果被加载的类,有...
      99+
      2022-11-21
      java类隔离 自定义类加载器 java类加载器
    • Java自定义类加载器实现类隔离详解
      目录一、背景二、解决思路2.1 创建依赖所在目录2.2 定义操作接口2.3 编写并构建业务包2.4 自定义类加载器2.5 主流程步骤三、总结一、背景 某服务需要连接操作多种组件(每种...
      99+
      2023-03-02
      Java类加载器实现类隔离 Java类加载器 类隔离 Java类加载器 Java 类隔离
    • Java中怎么实现类隔离加载
      Java中怎么实现类隔离加载,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一 什么是类隔离技术只要你 Java 代码写的足够多,就一定会出现这种情况:系统新引入了一个中间件...
      99+
      2023-06-15
    • java类加载器怎么自定义
      要自定义Java类加载器,可以继承ClassLoader类,并重写它的findClass()方法。下面是一个简单的示例:```jav...
      99+
      2023-09-14
      java
    • java怎么自定义类加载器
      要自定义类加载器,可以按照以下步骤进行:1. 创建一个类,继承自java.lang.ClassLoader类,覆盖其中的findCl...
      99+
      2023-09-14
      java
    • 怎么在java中自定义一个类加载器
      本篇文章为大家展示了怎么在java中自定义一个类加载器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。如果要使用自定义类加载器加载class文件,就需要继承java.lang.ClassLoader类...
      99+
      2023-05-30
      java
    • Java基础之自定义类加载器
      目录一、类加载器关系二、基于本地class文件的自定义类加载器三、遇到的问题四、基于网络(url)class文件的自定义类加载器一、类加载器关系 自定义类加载器 创建一个类继承C...
      99+
      2022-11-12
    • Java中如何自定义一个类加载器
      目录如何自定义加载器?示例:读取某文件的下的某class文件类加载器的使用及自定义类加载器如何自定义加载器? 1.创建一个自定义加载器类 继承 ClassLoader 类 2.重写 ...
      99+
      2022-11-21
      Java自定义类加载器 自定义类加载器 Java类加载器
    • java怎么自定义标签实现类
      要自定义一个标签实现类,需要按照以下步骤进行操作: 创建一个类,该类需要实现javax.servlet.jsp.tagext.T...
      99+
      2023-10-28
      java
    • Java自定义类加载器及JVM自带的类加载器之间的交互关系是什么
      这篇“Java自定义类加载器及JVM自带的类加载器之间的交互关系是什么”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“Java自定义类加载器及JVM自带的类加载器之间的交互关系是什么”,小编整理...
      99+
      2023-06-06
    • Java中的异常类怎么实现自定义
      Java中的异常类怎么实现自定义?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java自定义异常类的实例详解为什么要自己编写异常类?假如jdk里面没有提供的异常...
      99+
      2023-05-31
      java ava
    • python怎么实现自定义异常类
      本篇内容介绍了“python怎么实现自定义异常类”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明通常可以继承Exception或子类。命名...
      99+
      2023-06-30
    • JVM自定义类加载器在代码扩展性实践分享
      目录一、背景二、类加载的时机三、加载四、双亲委派模型4.1 启动类加载器4.2 扩展类加载器4.3 应用程序类加载器五、自定义类加载器六、代码实现6.1 实现自定义的类加载器6.2 ...
      99+
      2022-11-13
    • Android中怎么通过自定义view实现进度条加载效果
      Android中怎么通过自定义view实现进度条加载效果,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。分析图:代码如下:package com.example.d...
      99+
      2023-05-30
      android view
    • c# WPF中自定义加载时怎么实现带动画效果的Form和FormItem
      本篇内容主要讲解“c# WPF中自定义加载时怎么实现带动画效果的Form和FormItem”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c# WPF中自定义加载时怎么实现带动画效果的Form和F...
      99+
      2023-06-07
    • 怎么在Java中利用AQS实现一个自定义同步器
      这篇文章主要为大家详细介绍了怎么在Java中利用AQS实现一个自定义同步器,文中示例代码介绍的非常详细,具有一定的参考价值,发现的小伙伴们可以参考一下:Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,...
      99+
      2023-06-06
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作