使用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()函数的所述类的实际实例。
这是接受的答案所说的,但措辞对我来说有点奇怪。
答案 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);
}