2013-06-02 1 views
0

Я получаю NoSuchFieldException на следующий кусок кода:Определение типа класса Generic напечатал поле

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. Любой указатель будет очень полезен для меня.

ответ

3

Если вы посмотрите на JavaDoc of getField(), вы видите проблему:

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

Вы должны использовать:

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

От JavaDoc ofgetDeclaredField():

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

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