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 版本的類文檔。
添加回答
舉報