2016-02-15 132 views
1

我有一個泛型類等被定義:獲取泛型類型的declaredFields牛逼

public class ExcelParser<T> { 
    private Workbook workbook; 

    public ExcelParser(InputStream is){ 
     workbook = new HSSFWorkbook(new POIFSFileSystem(new ByteArrayInputStream(bytes))); 
    } 

    public List<T> retrieveRecordList() { 
     Field[] fields = T.class.getDeclaredFields();// here will give a error 
    } 
} 

我試圖做的是編寫雲解析Excel中的記錄與JavaBean list一個泛型類,但我不能讓來自泛型類型T的declaredFields,有沒有辦法做到這一點?

+1

如果沒有'()',retrieveRecordList甚至不會編譯 - 你在哪裏使用T的實際實例?如果你有一個實例T t,那麼t.getClass()會爲你做訣竅 – Jan

回答

6

你應該在運行時存儲ExcelParser類中Class<T>,以獲得元信息有關T

public class ExcelParser<T> { 
    private Workbook workbook; 
    private Class<T> clazz; 

    public ExcelParser(InputStream is, Class<T> clazz) { 
     workbook = new HSSFWorkbook(new POIFSFileSystem(new ByteArrayInputStream(bytes))); 
     this.clazz = clazz; 
    } 

    public List<T> retrieveRecordList() throws Exception { 
     Field[] fields = clazz.getDeclaredFields(); 
    } 
} 
+0

換句話說,所有*泛型T *將在運行時被擦除,所以我無法將類信息傳遞給*通過泛型類型解析類*,但只能通過將類信息傳遞給*解析類*通過構造函數或其他方法來做到這一點,我是否正確? – armnotstrong

+0

是的,這是正確的。 –

+0

然後看起來在這種情況下使用泛型類型不會有太大的幫助。 – armnotstrong

0

添加字段classT和僞參數的構造函數。

public class ExcelParser<T> { 
    private Workbook workbook; 

    private final Class<?> classT; 

    @SafeVarargs 
    public ExcelParser(InputStream is, T... dummyArguments){ 
     workbook = new HSSFWorkbook(new POIFSFileSystem(new ByteArrayInputStream(bytes))); 
     classT = dummyArguments.getClass().getComponentType(); 
     System.out.println(classT); 
    } 

並調用沒有dummyArguments的構造函數。

ExcelParser<Baz> parser = new ExcelParser<>(is /* no dummyArguments */); 

classT被分配到Baz.class

+0

我把這個解決方案的「參數化變參數類型T的可能的堆污染」警告它會產生。 –