Определить тип класса универсального типизированного поля

Я получаю 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 не имеет метода получения и получения. Также это поле не инициализируется. Вот почему я не могу позвонить criteriaType.getClass() как это бросать NullPointerException,

Моя цель - определить тип класса T и я не хочу передавать класс T в конструкторе этого MultipleSorting учебный класс.

Я не могу понять, почему я получаю NoSuchFieldException, Любой указатель был бы очень полезен для меня.

1 ответ

Решение

Если вы посмотрите на JavaDocgetField()Вы видите проблему:

Возвращает объект Field, который отражает указанное открытое поле члена класса или интерфейса, представленного этим объектом Class.

Вам необходимо использовать:

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

Из JavaDocgetDeclaredField():

Возвращает объект Field, который отражает указанное объявленное поле класса или интерфейса, представленного этим объектом Class.

Обратите внимание, что getDeclaredField(), В отличие от getField(), не найдет унаследованных полей.

Другие вопросы по тегам