簡體   English   中英

Java - 獲取Method的泛型類型的反射

[英]Java - Reflection to get Method's Generic Type

我正在嘗試創建一個服務容器,並想知道如何反映調用該方法時使用的類型。 見下文:

public class ServiceContainer {

   HashMap<Type, Object> services;

   public ServiceContainer() {
      services = new HashMap<Type, Object>();
   }

   public <T> void addService(Type t, T object) {
      services.put(t, object);
   }
   public <T> void addService(T object) {
      Type type = typeof(T);
      services.put(type, object);
   }
}

我更喜歡使用第二個addService,但如果這不可能,那就是可以依賴的東西了。

編輯:我想我找到了addService的解決方案,但是現在有另一種方法無法用同樣的方法解決:

public class ServiceContainer {
   HashMap<Class, Object> services;

   public ServiceContainer() {
      services = new HashMap<Class, Object>();
   }

   public <T> void addObject(T object) {
      Class type = object.getClass();
      services.put(type, object);
   }
   public <T> boolean containsService() {
   }
   public <T> T getService() {
      services.get(
         ServiceContainer.class.getMethod( "getService", null )
            .getGenericParameterTypes()[0] );
   }
}

我現在有點在黑暗中射擊,我應該去看一些文件......

除非您映射類名(而不是Type ),否則第二個addService是不可能的 - 例如

public class ServiceContainer {
 HashMap<Class, Object> services;

 public ServiceContainer() {
     services = new HashMap<Class, Object>();
 }

 public <T> void addService(Class<T>, T object) {
     services.put(t, object);
 }
 public <T> void addService(T object) {
     Class type = object.getClass();
     services.put(type, object);
 }
}

typeOfT()不起作用的原因是因為java泛型在編譯后被“擦除”。 實際上只有'語法糖'才能用於檢查類型賦值中明顯錯誤的八卦者。

編輯:自問題發生變化:實現containsService方法:

public boolean containsService(String classname) {
   return services.get(Class.forName(classname)) != null;
}

我會說,鑒於您正在做的事情非常普遍,請了解如何使用依賴注入庫來執行服務注冊和檢索。 我聽說有關Spring的好消息,還有google Guice

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM