Java动态获取某个接口下所有的实现类对象集合

简介: Java动态获取某个接口下所有的实现类对象集合

场景:MyServiceImpl1 和 MyServiceImpl2 都实现了 MyService接口

@Service
public class MyServiceImpl1 implements MyService {
    @Override
    public Type getType() {
        return Type.ONE;
    }
    // ...
}

@Service
public class MyServiceImpl2 implements MyService {
    @Override
    public Type getType() {
        return Type.TWO;
    }
    // ...
}

方式1,通过set注入

@Component
public class InitializeTest {
 
    private static Map<Type, MyService> myServiceMap = new LinkedHashMap<>();
 
    @Autowired(required = false)
    public void setMyServices(List<MyService> services) {
        myServiceMap.clear();
        for (MyService service : services) {
            myServiceMap.put(service.getType(), service);
        }
    }
 
    public static MyService getMyServiceByType(Type type) {
        return myServiceMap.get(type);
    }
}

方式2, 通过反射获取同一包下的,都实现了MyService接口的实现类

@Component
public class MyCommandRunner implements CommandLineRunner {
 
    @Autowired
    private ApplicationContext applicationContext;
 
    private static Map<Type, MyService> myServiceMap = new LinkedHashMap<>();
 
    @Override
    public void run(String... args) {
        // MyCommandRunner 与实现了MyService接口的实现类位于同一包下
        Reflections reflections = new Reflections(this.getClass().getPackage().getName());
        Set<Class<? extends MyService>> myClasses = reflections.getSubTypesOf(MyService.class);
        for (Class<? extends MyService> myClass : myClasses) {
            MyService myService = applicationContext.getBean(monitor);
            myServiceMap.put(myService.getType(), myService);
        }
    }
 
    public static MyService getMyServiceByType(Type type) {
        return myServiceMap.get(type);
    }
}
目录
相关文章
|
9月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
381 4
|
9月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
391 5
|
9月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
425 1
|
9月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
352 1
|
9月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
531 1
|
9月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
343 0
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
298 19
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
174 10
|
Java
Java 对象和类
在Java中,**类**(Class)和**对象**(Object)是面向对象编程的基础。类是创建对象的模板,定义了属性和方法;对象是类的实例,通过`new`关键字创建,具有类定义的属性和行为。例如,`Animal`类定义了`name`和`age`属性及`eat()`、`sleep()`方法;通过`new Animal()`创建的`myAnimal`对象即可调用这些方法。面向对象编程通过类和对象模拟现实世界的实体及其关系,实现问题的结构化解决。
199 4
|
机器学习/深度学习 人工智能 算法
探索人工智能在医疗诊断中的应用与挑战Java编程中的对象和类:基础与实践
【8月更文挑战第27天】随着人工智能(AI)技术的飞速发展,其在医疗领域的应用日益广泛。本文深入探讨了AI技术在医疗诊断中的具体应用案例,包括图像识别、疾病预测和药物研发等方面,并分析了当前面临的主要挑战,如数据隐私、算法偏见和法规限制等。文章旨在为读者提供一个全面的视角,理解AI在改善医疗服务质量方面的潜力及其局限性。