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);
    }
}
目录
相关文章
|
12天前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
25 3
|
18天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
39 8
|
14天前
|
Java API
Java中内置的函数式接口
Java中内置的函数式接口
19 2
|
19天前
|
Java
在Java中如何实现接口?
实现接口是 Java 编程中的一个重要环节,它有助于提高代码的规范性、可扩展性和复用性。通过正确地实现接口,可以使代码更加灵活、易于维护和扩展。
42 3
|
18天前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
55 1
|
18天前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
35 1
|
18天前
|
Java
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
32 1
|
23天前
|
Java Android开发
Eclipse 创建 Java 接口
Eclipse 创建 Java 接口
25 1
|
23天前
|
Java Android开发
Eclipse 创建 Java 类
Eclipse 创建 Java 类
23 0
|
4月前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
62 7