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