Java获取接口所有实现类的方式详解
作者:heaven夏 时间:2022-06-11 14:44:27
有时候,根据业务逻辑的需求,我们想要获取到某个接口的所有实现类。在这里大致介绍两种方式:
1.借助Spring容器实现
Spring作为一个容器,管理着一个项目中所有经过配置的Java类(xml配置文件或Annotation方式)。如果某个接口的所有实现类均被Spring托管了,那么通过Spring就可以很简单的返回这些实现类。
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class ServiceLocator implements ApplicationContextAware{
/**
* 用于保存接口实现类名及对应的类
*/
private Map<String, IService> map;
/**
* 获取应用上下文并获取相应的接口实现类
* @param applicationContext
* @throws BeansException
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
//根据接口类型返回相应的所有bean
Map<String, IService> map = applicationContext.getBeansOfType(IService.class);
}
public Map<String, IService> getMap() {
return map;
}
}
2.借助ServiceLoader类
ServiceLoader是JDK自带的一个类加载器,位于java.util包当中,作为 A simple service-provider loading facility. 具体使用方式如下:
1.在META-INF/services/目录下用你的接口全路径名称命名一个文件(不加后缀),然后在该文件中一行一个添加你的接口实现类的全路径名。
2.通过load方法来加载出所有的接口实现类
ServiceLoader<MyInterface> loader = ServiceLoader.load(MyInterface.class);
在这里load方法的返回值是一个迭代器,用这个迭代器可以遍历出所有的接口实现类。
总结
以上两种方式,实现的功能都是一样的,实现方式不同,底层用的技术一样的,都是反射。至于选择哪一种,我建议如果项目中的接口实现类都被Spring托管了,那当然是直接用Spring了。如果没有用到Spring的话,那就用ServiceLoader,这个肯定是没有问题的。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
来源:https://www.cnblogs.com/heaveneleven/p/9125228.html
标签:Java,接口所有实现类
0
投稿
猜你喜欢
使用WebSocket实现即时通讯(一个群聊的聊天室)
2023-11-29 03:00:46
Java springboot yaml语法注解
2023-06-17 08:13:35
使用Jitpack发布开源Java库的详细流程
2021-12-18 06:55:58
解决RabbitMq消息队列Qos Prefetch消息堵塞问题
2021-11-17 17:36:13
Java源码解析之object类
2023-11-05 00:46:28
java创建子类对象设置并调用父类的变量操作
2023-10-13 18:16:13
浅谈Java 继承接口同名函数问题
2023-07-22 13:28:47
详解SpringBoot定制@ResponseBody注解返回的Json格式
2023-07-26 13:47:02
Java实现map转换成json的方法详解
2022-09-09 12:26:03
Java Annotation(Java 注解)的实现代码
2023-01-09 00:36:17
vue+springboot前后端分离工程跨域问题解决方案解析
2023-08-06 06:51:10
Java8中stream和functional interface的配合使用详解
2023-02-27 22:44:51
Windows下Java环境配置的超详细教程
2021-12-18 19:19:16
Spring boot + mybatis + orcale实现步骤实例代码讲解
2023-07-11 22:50:09
Android Studio和Gradle使用不同位置JDK的问题解决
2023-06-27 17:35:04
JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现
2023-09-17 17:03:59
Java单例模式下的MongoDB数据库操作工具类
2023-11-20 12:55:01
一文带你了解C#中抽象方法与虚方法的区别
2023-07-23 00:14:32
JAVA 字符串加密、密码加密实现方法
2023-11-28 04:08:09
分析JVM源码之Thread.interrupt系统级别线程打断
2023-07-31 17:15:23