无法从类中获取枚举值

时间:2014-10-09 15:38:37

标签: java reflection

使用REST api,我有以下设置:

public enum Ready {
    YES,
    NO;
}

public class Top {
     public Ready readyField;
}

其中有几个:

public class Bottom extends Top {
    ... some fields
}

现在,我正在对扩展Top类的类进行过滤。所以我使用Reflection来尝试获取字段值,如果过滤器失败,则实例不会被返回。

一个这样的过滤器可以在" readyField"上。所以,让我们说我的网址如下:" http ... /?isReady = no"。

我的代码如下所示:

Field field = Bottom.class.getField("readyField");
Class<?> type = field.getType();
if (type.isEnum()) {
    Object object = field.get(Bottom.class);
    if (!object.toString().equalsIgnoreCase(value)) {
        resultList.remove(instance);
        continue;
    }
}

值字段是&#34; no&#34;来自网址的字符串。

这会抛出一个execption:

  

java.lang.IllegalArgumentException:无法设置“就绪”字段   Top.readyField到java.lang.Class

我很难过。我在Google上找到的所有内容都与从枚举类本身获取枚举值有关。没有尝试使用该枚举来比较类中指定枚举字段的字符串值。

我已经得到了我需要的对象实例。我需要的是获取类中枚举的值并将其与给定的字符串进行比较。

编辑:

看来,解决方案不是使用Bottom.class,而是使用get()函数的所述类的实际实例。

这是接受的答案所说的,但措辞对我来说有点奇怪。

2 个答案:

答案 0 :(得分:3)

Field#get(Object)的参数必须是字段出现的实例,而不是此类实例的Class对象。

  

返回指定对象上此Field表示的字段的值。

所以你需要像

这样的东西
Bottom bottom = ...;
...
Object object = field.get(bottom);

类似地,Field#set(Object, Object)期望第一个参数是设置字段值的实例。

  

设置指定的此Field对象所表示的字段   对象参数指定的新值。

答案 1 :(得分:0)

将请求参数从URL复制到Bottom对象:

String requestParam = reqest.getRequestParameter("isReady"); // "no"
requestParam = requestParam.toUpperCase(); // "NO"

// Case typed
Bottom bottom = new Bottom();
bottom.isReady = Ready.valueOf(requestParam);

// Case via reflection:
Object struct = new Bottom();
Field field = Bottom.class.getField("readyField");
Class<?> type = field.getType();
if (type.isEnum()) {
    Object value = Enum.valueOf(requestParam);
    field.set(struct, value);
}