获取泛型类型T的declaredFields

时间:2016-02-15 10:46:56

标签: java generics

我有一个定义如下的泛型类:

 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,有没有办法那样做?

2 个答案:

答案 0 :(得分:6)

您应该将Class<T>存储在ExcelParser类中,以便在运行时获取有关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();
    }
}

答案 1 :(得分: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