ServiceLoader用于查找接口的实现

时间:2012-04-24 18:44:51

标签: java serviceloader

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

3 个答案:

答案 0 :(得分:33)

ServiceLoader无法做到。

为了将类公开为可由ServiceLoader发现的服务,您需要将其名称放入提供程序配置文件中,如Creating Extensible Applications With the Java Platform 中所述。

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

答案 1 :(得分:21)

如果这些实现是您自己编写的,您可以使用AutoService通过ServiceLoader界面使其可用,例如

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

}

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

}

答案 2 :(得分:2)

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