Java獲取介面所有實現類的方式詳解
阿新 • • 發佈:2020-01-07
有時候,根據業務邏輯的需求,我們想要獲取到某個介面的所有實現類。在這裡大致介紹兩種方式:
1.藉助Spring容器實現
Spring作為一個容器,管理著一個專案中所有經過配置的Java類(xml配置檔案或Annotation方式)。如果某個介面的所有實現類均被Spring託管了,那麼通過Spring就可以很簡單的返回這些實現類。
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component public class ServiceLocator implements ApplicationContextAware{ /** * 用於儲存介面實現類名及對應的類 */ private Map<String,IService> map; /** * 獲取應用上下文並獲取相應的介面實現類 * @param applicationContext * @throws BeansException */ @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { //根據介面型別返回相應的所有bean Map<String,IService> map = applicationContext.getBeansOfType(IService.class); } public Map<String,IService> getMap() { return map; } }
2.藉助ServiceLoader類
ServiceLoader是JDK自帶的一個類載入器,位於java.util包當中,作為 A simple service-provider loading facility. 具體使用方式如下:
1.在META-INF/services/目錄下用你的介面全路徑名稱命名一個檔案(不加字尾),然後在該檔案中一行一個新增你的介面實現類的全路徑名。
2.通過load方法來加載出所有的介面實現類
ServiceLoader<MyInterface> loader = ServiceLoader.load(MyInterface.class);
在這裡load方法的返回值是一個迭代器,用這個迭代器可以遍歷出所有的介面實現類。
總結
以上兩種方式,實現的功能都是一樣的,實現方式不同,底層用的技術一樣的,都是反射。至於選擇哪一種,我建議如果專案中的介面實現類都被Spring託管了,那當然是直接用Spring了。如果沒有用到Spring的話,那就用ServiceLoader,這個肯定是沒有問題的。希望對大家的學習有所幫助,也希望大家多多支援我們。