2014-10-09 22 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); 
}