2 回答
TA贡献1785条经验 获得超8个赞
答案取决于课程的用途。但是,如果您不介意以实例化类的无序集合结束,可以使用Reflections库,我想在代码行问题上也是一个简短的方法:
// find out all the classes implementing MyInterface
Set<Class<? extends MyInterface>> subTypes = reflections.getSubTypesOf(MyInterface.class);
// iterate those classes and instntinate them
List<MyInterface> objects = new ArrayList<>();
for (Class<? extends MyInterface> clazz: subtypes) {
objects.add(clazz.newInstance());
}
无论如何,整个设计都应该重新考虑。
TA贡献1853条经验 获得超6个赞
推荐的解决方案是使用服务加载器架构。
实例化所有已注册的实现MyInterface
可以简单地完成
for(MyInterface my: ServiceLoader.load(MyInterface.class)) { /* do something with <my> */ }
为了使这项工作有效,仅实现接口是不够的,必须将这些实现声明为服务提供者,要么通过META-INF/services/
jar 文件中的条目(如链接类文档中所述),要么通过provides
Java 模块声明中的声明,当使用 Java 9 或更新版本。
这样做的好处不仅是更高的性能,与使用反射库搜索整个类路径相比,它还确保在将来使用 Java 的模块系统时建立必要的访问权限。
另请参阅Java 9 版本的类文档。
添加回答
举报