2011-05-08 127 views
3

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

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]); 
    } 
} 

我是那種在黑暗中拍攝的,現在,我應該刷上一些文檔...

回答

5

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

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泛型在編譯後被「擦除」。它實際上只是'語法糖',ocmpiler用來檢查類型分配中的明顯錯誤。

編輯:自提改變:爲貫徹落實containsService方法:

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

我說,因爲你在做什麼是很常見的,看看到了如何使用依賴注入庫來執行您的服務註冊和檢索。我聽到有關Springgoogle Guice的好消息。

+1

我該如何去回答containsService? Class和Type有什麼不同? java文檔有點模糊 – 2011-05-08 03:01:42

+0

我會傳入一個Class文字(例如,MyService.class),或者甚至是類的名字到containsService方法中。 – Chii 2011-05-08 05:03:18

+0

我不知道你的意思是什麼類型 - 我認爲這是你自己寫的一個類,它指定了服務的類型(除非你的意思是http://download.oracle.com/javase/1,5.0/docs/ api/java/lang/reflect/Type.html - 在你的情況下這對你沒有用處 – Chii 2011-05-08 05:04:19