2 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
答案取決于課程的用途。但是,如果您不介意以實(shí)例化類的無(wú)序集合結(jié)束,可以使用Reflections庫(kù),我想在代碼行問(wèn)題上也是一個(gè)簡(jiǎn)短的方法:
// 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());
}
無(wú)論如何,整個(gè)設(shè)計(jì)都應(yīng)該重新考慮。

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
推薦的解決方案是使用服務(wù)加載器架構(gòu)。
實(shí)例化所有已注冊(cè)的實(shí)現(xiàn)MyInterface
可以簡(jiǎn)單地完成
for(MyInterface my: ServiceLoader.load(MyInterface.class)) { /* do something with <my> */ }
為了使這項(xiàng)工作有效,僅實(shí)現(xiàn)接口是不夠的,必須將這些實(shí)現(xiàn)聲明為服務(wù)提供者,要么通過(guò)META-INF/services/
jar 文件中的條目(如鏈接類文檔中所述),要么通過(guò)provides
Java 模塊聲明中的聲明,當(dāng)使用 Java 9 或更新版本。
這樣做的好處不僅是更高的性能,與使用反射庫(kù)搜索整個(gè)類路徑相比,它還確保在將來(lái)使用 Java 的模塊系統(tǒng)時(shí)建立必要的訪問(wèn)權(quán)限。
另請(qǐng)參閱Java 9 版本的類文檔。
添加回答
舉報(bào)