BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #62980同步于 2019/11/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

【已解决】Java 关于SPI实现未果的问题

xiaoxiaohai
2019/11/10镜像同步14 回复
附件(3.4KB) src.zip 我已经将源码打包了,以下是文字版的代码块。 接口:也就是SPI中的service ```JAVA public interface HelloInterface { void sayHello(); } ``` 实现接口的两个Java类: ```JAVA public class TextHello implements HelloInterface { @Override public void sayHello() { System.out.println("TextHello."); } } ``` 以及 ```JAVA public class ImageHello implements HelloInterface { @Override public void sayHello() { System.out.println("imgHello."); } } ``` 测试代码: ```JAVA public class MyTest26 { public static void main(String[] args) { ServiceLoader<HelloInterface> loaders = ServiceLoader.load(HelloInterface.class); for (HelloInterface in : loaders){ in.sayHello(); } } } ``` 但是为何控制台没有输出任何东西?百思不得其解。还有案例代码来源于: https://www.jianshu.com/p/46aa69643c97 还有META-INF/services文件夹中的配置文件如下图所示:
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nanguohao机器人#1 · 2019/11/10
那你debug一下,看loders是不是空的
xiaoxiaohai机器人#2 · 2019/11/10
【 在 nanguohao 的大作中提到: 】 : 那你debug一下,看loders是不是空的 按照你的意思,我简单地改为: ```java public static void main(String[] args) { ServiceLoader<HelloInterface> loaders = ServiceLoader.load(HelloInterface.class); System.out.println(loaders.iterator().hasNext()); for (HelloInterface in : loaders){ in.sayHello(); System.out.println(1); } } ``` 控制台输出:flase 迭代器里根本没有元素,这意味着ServiceLoader没有加载成功provider吗?我的配置文件应该没有写错吧。
cc19931002机器人#3 · 2019/11/10
看下services的配置文件一块打包到了编译后的输出目录了没(一般是target目录或者out目录),如果输出了,检查下文件内容对不对。 最后,不知道你用spi是像完成什么功能,当初我有短时间要做这个功能,开始考虑用的spi,后面换成了用org.reflections;reflections,可以看下符不符合你的需求
xiaoxiaohai机器人#4 · 2019/11/10
【 在 cc19931002 的大作中提到: 】 : 看下services的配置文件一块打包到了编译后的输出目录了没(一般是target目录或者out目录),如果输出了,检查下文件内容对不对。 : 最后,不知道你用spi是像完成什么功能,当初我有短时间要做这个功能,开始考虑用的spi,后面换成了用org.reflections;reflections,可以看下符不符合你的需求 我的目的是:验证使用SPI机制,可以用ServiceLoader类来联系Service(接口)和Provider(子类)之间被实现和实现的关系。源代码已经打包为一个src.zip了,希望你能替我看看(包括配置文件)。配置文件是否被打包到编译后的输出目录这一点我真的不知道如何来看,这方面学得不好。
cc19931002机器人#5 · 2019/11/10
你用的什么编译器,idea还是eclipse 【 在 xiaoxiaohai 的大作中提到: 】 : : 我的目的是:验证使用SPI机制,可以用ServiceLoader类来联系Service(接口)和Provider(子类)之间被实现和实现的关系。源代码已经打包为一个src.zip了,希望你能替我看看(包括配置文件)。配置文件是否被打包到编译后的输出目录这一点我真的不知道如何来看,这方面学得不好。
shixu机器人#6 · 2019/11/10
META-INF放在哪个路径下了?
xiaoxiaohai机器人#7 · 2019/11/11
【 在 cc19931002 的大作中提到: 】 : 你用的什么编译器,idea还是eclipse IDEA
xiaoxiaohai机器人#8 · 2019/11/11
【 在 shixu 的大作中提到: 】 : META-INF放在哪个路径下了? 目录结构如图所示。
cc19931002机器人#9 · 2019/11/11
你就用idea运行的花,,左侧工程目录下面会有个橙色的target或者out目录 【 在 xiaoxiaohai 的大作中提到: 】 : IDEA