2009-06-02 65 views
4

我有一個類,看起來像這樣:Java泛型和反思!

public class UploadBean { 


    protected UploadBean(Map<String,?> map){ 
     //do nothing. 
    } 
} 

使用反射,並通過調用相應的構造函數創建一個對象,我寫的代碼如下:

Class<?> parTypes[] = new Class<?>[1]; 
parTypes[0] = Map.class; 
Constructor ct = format.getMappingBean().getConstructor(parTypes); 
Object[] argList = new Object[1]; 
argList[0] = map; 
Object retObj = ct.newInstance(argList); 

此代碼在運行時失敗, 「沒有這樣的方法例外」。 現在,我該如何正確設置參數類型?!這樣構造函數中的通用映射參數被識別出來了?

+0

什麼是「格式」? – 2009-06-02 14:36:27

+0

格式是這樣的一個實現: public interface FormatFactory { \t public Map getFormat(); \t public class <?擴展UploadBean> getMappingBean(); } – Jay 2009-06-02 14:44:10

回答

7

該構造函數被保護 - 如果你使它公開使用getDeclaredConstructor而不是getConstructor它應該工作。

(你需要使用setAccessible如果你想從一個地方叫這個,你就不能正常訪問)

編輯:這是一個測試顯示它好工作:

import java.lang.reflect.*; 
import java.util.*; 

public class UploadBean { 

    // "throws Exception" just for simplicity. Not nice normally! 
    public static void main(String[] args) throws Exception { 
     Class<?> parTypes[] = new Class<?>[1]; 
     parTypes[0] = Map.class; 
     Constructor ct = UploadBean.class.getDeclaredConstructor(parTypes); 
     Object[] argList = new Object[1]; 
     argList[0] = null; 
     Object retObj = ct.newInstance(argList); 
    } 

    protected UploadBean(Map<String,?> map){ 
     //do nothing. 
    } 
} 
+0

或使用getDeclaredConstructor(),因爲我剛剛發現(但太晚了!)。 – 2009-06-02 14:41:32

0

我相信你需要調用

ct.setAccessible(true) 

的setAccessible方法允許你覆蓋的接入方式。

1

通用信息在運行時不可用,它只是用於靜態分析,所以就像泛型不存在一樣。