2014-10-09 21 views
0

与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; 
    } 
} 

值字段是“无”,从URL字符串。

这将引发execption:

java.lang.IllegalArgumentException异常:无法就绪场 Top.readyField设置为java.lang.Class中

而且我很为难。我在Google上找到的所有东西都与获取枚举类本身的枚举值有关。尝试使用该枚举比较类中分配的枚举字段的字符串值无关。

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

编辑:

的解决方案,它的出现,是不是使用Bottom.class,但对于GET()函数表示类的实际实例。

这是公认的答案说什么,但措辞有点怪我。

+0

对于全自动'枚举就绪{是,否};'。否则,也许'Enum.valueOf(type,string.toUpperCase())'是你的东西。我不完全确定你在concreto中想要什么。 – 2014-10-09 15:50:48

+0

@JoopEggen我想要的是查看URL中给予我的字符串是否与设置为对象实例的枚举值相对应。 – KdgDev 2014-10-09 18:48:39

回答

3

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

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

所以,你会需要像

Bottom bottom = ...; 
... 
Object object = field.get(bottom); 

同样,Field#set(Object, Object)预期的第一个参数是要在其上设置字段值的实例。

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

+0

这些都已经在代码中了。它就在那里。你所说的关于获得领域的一切都已经在我给出的例子中。 – KdgDev 2014-10-09 18:47:58

+0

@KdgDev你正在做'field.get(Bottom.class)',它与'field.get(someBottomInstance)'非常不同。 – 2014-10-09 18:49:35

+0

我不明白你为什么甚至提到设置的方法。它不在我的代码中,我不是在谈论它。 – KdgDev 2014-10-09 19:40:56

0

于所述请求参数从URL复制到一个底物:

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); 
}