确定通用类型字段的类类型

时间:2013-06-02 08:34:09

标签: java generics reflection field nosuchfieldexception

我收到NoSuchFieldException以下代码:

public class MultipleSorting<T> extends Observable {
    private SelectItem[] criteria1;
    private SelectItem[] order1;
    private SelectItem[] criteria2;
    private SelectItem[] order2;
    private SelectItem[] criteria3;
    private SelectItem[] order3;

    private T criteriaType;

    private T selectedCriteria1;
    private SortOrder selectedOrder1;
    private T selectedCriteria2;
    private SortOrder selectedOrder2;
    private T selectedCriteria3;
    private SortOrder selectedOrder3;    

    private Boolean[] enabledRows = new Boolean[]{Boolean.TRUE, Boolean.FALSE, Boolean.FALSE};

    private Boolean addButtonVisible1 = Boolean.TRUE;
    private Boolean addButtonVisible2 = Boolean.FALSE;
    private Boolean addButtonVisible3 = Boolean.FALSE;

    public MultipleSorting() {
        super();
    }

    private Class<T> getCriteriaClass() throws NoSuchFieldException {
        Field field = this.getClass().getField("criteriaType");
        field.setAccessible(true);
        return (Class<T>)field.getType();
    }

    public void addOrRemoveRow(ActionEvent event) {
        // other codes
        Method setSelectedCriteriaMethod = getClass().getDeclaredMethod("setSelectedCriteria" + (index + 1), new Class[]{getCriteriaClass()});  
        // other codes
    }

    // getters and setters
}

当我调用方法getCriteriaClass()时,我收到异常。 criteriaType没有任何getter和seeter方法。此字段也未初始化。这就是为什么我无法调用criteriaType.getClass(),因为它正在抛出NullPointerException

我的目标是确定T的类类型,我不想在此MultipleSorting类的构造函数中传递T类。

我无法理解为什么我会得到NoSuchFieldException。任何指针都对我很有帮助。

1 个答案:

答案 0 :(得分:3)

如果查看JavaDoc of getField(),就会发现问题:

  

返回一个Field对象,该对象反映此Class对象所代表的类或接口的指定公共成员字段

您需要使用:

Field field = this.getClass().getDeclaredField("criteriaType");

来自JavaDoc ofgetDeclaredField()

  

返回一个Field对象,该对象反映此Class对象所表示的类或接口的指定声明字段。

请注意getDeclaredField()getField()不同,不会找到继承的字段。