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