用于查找接口实现的 ServiceLoader

2022-09-01 18:14:37

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

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找不到任何类。我觉得我错过了一个微不足道的点...


答案 1

ServiceLoader做不到。

为了将类公开为可由您发现的服务,您需要将其名称放入提供程序配置文件中,如使用 Java 平台创建可扩展应用程序中所述。ServiceLoader

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


答案 2

如果实现是您自己编写的,则可以使用AutoService通过接口使它们可用,例如ServiceLoader

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

}

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

}

推荐