簡體   English   中英

確定通用類型字段的類類型

[英]Determine class type of Generic typed field

我正在為下面的代碼獲取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的類類型,並且我不想在此MultipleSorting類的構造函數中傳遞T的類。

我不明白為什么我得到NoSuchFieldException 任何指針對我都會非常有幫助。

如果查看getField()JavaDoc ,則會看到問題:

返回一個Field對象,該對象反映此Class對象表示的類或接口的指定公共成員字段

您需要使用:

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

getDeclaredField()JavaDoc中

返回一個Field對象,該對象反映此Class對象表示的類或接口的指定聲明字段。

請注意,與getField()不同, getDeclaredField()不會找到繼承的字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM