Java ServiceLoader查找接口的实现
我尝试使用Java查找实现特定接口的所有类,如下所示: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); } 不幸的是,当
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下创建一个具有正确命名方案的文件。