我收到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
。任何指针都对我很有帮助。
答案 0 :(得分:3)
如果查看JavaDoc of getField()
,就会发现问题:
返回一个Field对象,该对象反映此Class对象所代表的类或接口的指定公共成员字段。
您需要使用:
Field field = this.getClass().getDeclaredField("criteriaType");
来自JavaDoc ofgetDeclaredField()
:
返回一个Field对象,该对象反映此Class对象所表示的类或接口的指定声明字段。
请注意getDeclaredField()
与getField()
不同,不会找到继承的字段。