2016-09-06 2 views
2

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

Object obj = gettingObjectFromSomeMethod(); 
    for (Field field : obj.getClass().getDeclaredFields()) { 
      field.setAccessible(true); 
      Object value = field.get(obj); 
      if (value != null) { 
       System.out.println(field.getName() + "=" + value); 
      } 
     } 

выход:

serialVersionUID=8683452581122892189 
DEFAULT_CAPACITY=10 
EMPTY_ELEMENTDATA=[Ljava.lang.Object;@5649fd9b 
DEFAULTCAPACITY_EMPTY_ELEMENTDATA=[Ljava.lang.Object;@6adede5 
elementData=[Ljava.lang.Object;@2d928643 
size=4 
MAX_ARRAY_SIZE=2147483639 

но когда я напечатать объект дает следующий вывод

[{long_name=Los Angeles, short_name=Los Angeles, types=[locality, political]}, {long_name=Los Angeles County, short_name=Los Angeles County, types=[administrative_area_level_2, political]}, {long_name=California, short_name=CA, types=[administrative_area_level_1, political]}, {long_name=United States, short_name=US, types=[country, political]}] 

Я хочу, чтобы получить значение этих полей .. Пожалуйста, посоветует, что делать

+0

кажется ваш класс вашего _object_ реализует аккуратный ToString. почему бы не назвать это? – Jayan

+0

Вероятно, второй вывод не показывает * полей * объекта, а интерпретацию его полей. –

+0

@Jayan toString не поможет. Мне нужно получить только short_name –

ответ

1

Я только что протестировал код, который возвращает список как ответ объекта, так что вы можете сделать это, как показано ниже. однако, если вы хотите указать конкретное поле, вы можете указать условие во внутреннем для цикла с полем.getName().

if(obj instanceof List){ 
    List myList = (List) obj;// this is your object which return from gettingObjectFromSomeMethod 


      for (Object object : myList) { 
       for (Field field : object.getClass().getDeclaredFields()) { 
        field.setAccessible(true); 

         System.out.println("field_Name"+ 
         field.getName() + "field_Value"+field.get(object)); 
       } 
      } 
} 

Если это решение не работает, то, пожалуйста, распечатайте System.out.println(obj.getClass().getName()); и дайте мне знать, чего он возвращается

+0

Спасибо, что его работа сейчас, но единственное, чего не хватает на выходе, это поле short_name и его значение. выход: 'поле_формы serialVersionUID FIELD_VALUE 3801124242820219131 поле_формы голова FIELD_VALUE параметра long_name = Лос-Анджелес поле_формы типа хвост FIELD_VALUE = [местонахождение, политические] поле_формы accessOrder FIELD_VALUE ложные поле_формы serialVersionUID FIELD_VALUE 3801124242820219131 поле_формы голова FIELD_VALUE параметра long_name = Los Angeles County поле_формы tail field_Value types = [administrator_area_level_2, политик] ' –

+0

Возможная причина этого в том, что это может быть приватная переменная класса на стороне сервера, сообщит вам, если я нашел что-то полезное для этого. Если это будет вам полезно, тогда любезно поднятый голос для этого –

+0

Mavric Я только что проверил, что он должен работать с pr ivate также, пожалуйста, сделайте, чтобы ваш список имел значение short_name в нем, напечатав в журнале –

Смежные вопросы