Определить тип класса универсального типизированного поля
Я получаю 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()
, не найдет унаследованных полей.