2014-10-09 7 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». Итак, скажем, мой url выглядит так: «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: Не удается установить Ready поле Top.readyField в java.lang.Class

И я тупик. Все, что я могу найти в Google, связано с получением значений enum из класса enum. Ничего о попытке сравнить строковое значение присвоенного поля enum в классе с использованием этого перечисления.

У меня уже есть экземпляры объектов, в которых я нуждаюсь. Мне нужно получить значение enum в классе и сравнить его с данной строкой.

EDIT:

Решение, по-видимому, не использует Bottom.class, но фактический экземпляр указанного класса для функции Get().

Это то, что говорится в принятом ответе, но формулировка была немного странной для меня.

+0

Для автоматизма 'перечисление Готов {да, нет};'. В противном случае, возможно, 'Enum.valueOf (type, string.toUpperCase())' для вас. Я не совсем уверен, что вы хотите в concreto. –

+0

@JoopEggen Я хочу видеть, соответствует ли строка, указанная мне в URL, значением enum, заданным для экземпляра объекта. – KdgDev

ответ

3

Аргумент Field#get(Object) должен быть экземпляром, где отображается поле, а не объект Class такого экземпляра.

Возвращает значение поля, представленного этим Field, на указанном объекте.

Так что вам нужно что-то вроде

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

Аналогично, Field#set(Object, Object) ожидает, что первый аргумент будет экземпляром, на котором, чтобы установить значение поля.

Устанавливает поле, представленное этим Field объекта на указанном объекте аргумента в указанное новое значение.не

+0

Вот и все в коде. Это прямо сейчас. Все, что вы сказали о получении поля, уже есть в примере, который я дал. – KdgDev

+0

@KdgDev Вы выполняете 'field.get (Bottom.class)', который сильно отличается от 'field.get (someBottomInstance)'. –

+0

Я не понимаю, почему вы даже упоминаете метод set. Его нет в моем коде, и я не говорю об этом. – KdgDev

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); 
} 
Смежные вопросы