【问题标题】:Determine class type of Generic typed field确定通用类型字段的类类型
【发布时间】:2013-06-02 08:34:08
【问题描述】:

我收到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。任何指针都会对我很有帮助。

【问题讨论】:

    标签: java generics reflection field nosuchfieldexception


    【解决方案1】:

    如果您查看JavaDoc of getField(),您会发现问题:

    返回一个反映此 Class 对象所表示的类或接口的指定公共成员字段的 Field 对象。

    你需要使用:

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

    来自JavaDoc ofgetDeclaredField()

    返回一个 Field 对象,反映此 Class 对象所表示的类或接口的指定声明字段。

    请注意,getDeclaredField()getField() 不同,它不会找到继承的字段。

    【讨论】:

    • 这是我看到的对nosuchfieldexception最好的解释。虽然没有提到这个异常的原因主要是版本不匹配
    猜你喜欢
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2012-12-23
    • 1970-01-01
    相关资源
    最近更新 更多