25

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

4

3 回答 3

36

ServiceLoader做不到。

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

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

于 2012-04-24T18:54:12.430 回答
25

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

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

}

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

}
于 2015-07-12T02:05:38.277 回答
3

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

于 2016-08-17T13:34:09.257 回答