Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ServiceLoader查找接口的实现_Java_Serviceloader - Fatal编程技术网

Java ServiceLoader查找接口的实现

Java ServiceLoader查找接口的实现,java,serviceloader,Java,Serviceloader,我尝试使用Java查找实现特定接口的所有类,如下所示: loader = ServiceLoader.load(Operation.class); try { for (Operation o : loader) { operations.add(o); } } catch (ServiceConfigurationError e) { LOGGER.log(Level.SEVERE, "Uncaught exception", e); } 不幸的是,当

我尝试使用Java查找实现特定接口的所有类,如下所示:

loader = ServiceLoader.load(Operation.class);
try {
    for (Operation o : loader) {
        operations.add(o);
    }
} catch (ServiceConfigurationError e) {
    LOGGER.log(Level.SEVERE, "Uncaught exception", e);
}

不幸的是,当我在调试模式下运行Eclipse时,ServiceLoader找不到任何类。我觉得我遗漏了一个小问题…

ServiceLoader
无法做到这一点

为了将类公开为可由
ServiceLoader
发现的服务,您需要将其名称放入提供者配置文件中,如中所述


没有内置的方法可以找到实现特定接口的所有类。可以执行类似操作的框架使用自己的类路径扫描解决方案(即使使用自定义类路径扫描也不容易,因为类文件只存储直接实现的接口信息,而不是传递的接口信息)。

如果实现是您自己编写的,您可以使用使它们通过
ServiceLoader
界面可用,例如

@AutoService(Operation.class)
class Foo implements FooInterface {

}

@AutoService(Operation.class)
class Bar extends Foo {

}

为了在运行时扫描类路径以查找特定接口的实现,您需要使用不同的解决方案,例如(最后请注意s,这不是java的反射API)

您是否配置了
META-INF/services/fqcn.Operation
?非常感谢您的建议!我只是无法使提供程序文件正常工作。一定是放错地方了,或者是打字错误什么的,但是这对maven来说是开箱即用的。我很乐意在maven存储库中找到最新版本!如果您有改进,请为未来的观众编辑答案。这项自动服务非常出色!“没有人害怕这是一个发行候选吗?”保罗,我认为这不是一个问题。ServiceLoader可以直接使用(只需坚持META-INF下的命名方案)。AutoService为您提供了一个使用注释的简单快捷方式,但它仍然只是这样做——在META-INF下创建一个具有正确命名方案的文件。