我正在寻找一种方法来查找当前在JVM中运行的继承给定接口的所有实例,例如interfaceA。我最初收到的建议是使用
Lookup.getDefault().lookupAll(interfaceA.class);
@ServiceProvider(service=interfaceA.class)
在定义实现接口a的类之前。我发现这确实找到了实现接口a的类。但是,我非常确定Lookup使用java反射为我提供了该类的新实例。我最大的问题是,对于可以引入哪些库到我的Netbeans项目,我是有限的,否则前面的问题应该已经回答了这个问题。
这样的动物存在于纯Java或非常知名的库中吗?
谢谢
no。由于java在需要时动态加载类,因此您无法真正"枚举"JVM可用的所有类。用于此的大多数机制涉及在路径上提前列出所有子类(xml文件,属性文件)并使用它们,或者将它们标记为某些容器的某种运行时处理(您的@ServiceProvider注释)。Java EE, Spring和guice是一些众所周知的容器——但是这样的代码将不能在这样的容器之外工作。
我也见过试图遍历类路径上的所有jar的代码,但是这样的代码非常脆弱,并且通常与它所运行的特定环境相关联。