1. 程式人生 > 程式設計 >Java獲取介面所有實現類的方式詳解

Java獲取介面所有實現類的方式詳解

有時候,根據業務邏輯的需求,我們想要獲取到某個介面的所有實現類。在這裡大致介紹兩種方式:

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,這個肯定是沒有問題的。希望對大家的學習有所幫助,也希望大家多多支援我們。