2013-04-01 7 views
0

Я столкнулся с проблемой, чтобы получить значение всех полей класса путем reflaction.Как получить все поля вместе со значением объекта Composite?

У меня есть один класс, который может иметь любое количество полей, любое количество классов и те классы, в свою очередь, может иметь любое количество полей, что-то вроде как ниже

public class A{ 
    String string; 
    int number; 
    HashMap<String,String> map; 
    B bclass; 
} 

Над B снова класс член класс А.

  1. Я хочу, чтобы поля типа Струнный и цЕННОСТИ их, и если поле класса
  2. Если поле класс, затем получите поля и значения, например, map свойство имеет тип HashMap тип класса, тогда мне нужны как свойства ключа, так и значения, которые имеют значение Строка Тип.

Пожалуйста, смотрите мой фрагмент кода, чтобы решить вышеуказанную проблему

private void extractStringFields(Object object) throws IllegalAccessException { 
    for (Field field : object.getClass().getDeclaredFields()) { 

     field.setAccessible(true); 
     System.out.println("filesd : "+field.getName()); 
     Object value = field.get(object); 

     if (field.getType().equals(String.class)) { 
      System.out.println(field.getName() + "=" + value); 
     } 
     extractStringFields(field); 
    } 
} 

Но, к сожалению, его не работает, помогите мне, пожалуйста.

+0

'Java'? Retagged – Andremoniy

+0

У HashMap нет полей/значений типа String (то, что вы смотрите на его общие параметры). Я * верю, что вы спрашиваете, как рекурсивно получить все поля объекта и его содержащиеся переменные. Вопрос в том, что вы должны вернуться в конце? – Perception

+1

Первая проблема заключается в том, что из-за стирания типа общие классы имеют поля типа 'Object'. Вторая проблема заключается в том, что вы, вероятно, не хотите, чтобы какие-либо поля в «HashMap» были закрыты по какой-либо причине. И, наконец, вы, вероятно, захотите назвать рекурсивный метод в 'else' вашим' if' и значением 'field'', а не' '' self'. Кроме того, как вы избежите бесконечных циклов? –

ответ

0

Когда вы передаете,

extractStringFields(field); 

он посылает объект Field. Поэтому, когда 2-й вызов вперед object.getClass даст вам Field.class. Для этого вы никогда не получите должного значения.
Лучше, если вы оставите другой перегруженный класс, вы пройдете поле. В этом методе вы можете написать это,

for (Field field : field.getType().getDeclaredFields()) 

Надеюсь, что это даст вам начало.

или вы можете использовать это:

if(value != null){ 
       extractStringFields(value); 
      } 
+0

оба предложения не работают – Ketan

+0

Я протестировал это. это работает. Просто проверьте, держит ли какой-либо объект тот же тип объекта или нет. в этом случае он будет проходить бесконечный цикл. вам нужно справиться с этим. Я использовал второе решение. –

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