2010-09-15 4 views
3

У меня есть класс Java с ~ 90 полями. Я хочу иметь возможность делать что-то в каждом поле (например, генерировать XML-элемент), не записывая те же 5 строк кода с небольшими заменами 90 раз. В Objective C я думаю, что вы можете получить переменные экземпляра способами, аналогичными доступу к элементам словаря (ObjectForKey). Есть ли что-то подобное в Java, так что я могу получить массив полей, а затем сделать что-то для каждого из них?Enumerate Java Fields

ответ

5

Да, это называется Reflection API.

В частности, MyClass.class.getDeclaredFields() будет возвращать полный список полей, объявленных этим классом (see API for details)

1

Вот другой подход: Используйте Introspector API с JDK для получения боба, как свойства класса. Это полезно, если у вас есть получатели и сеттеры для вашего класса, и вы не хотите напрямую обращаться к частным полям. Получите BeanInfo через Introspector и получите от него все propertyDescriptors. Найти геттер этого свойства.

Я должен признать, что использование этого API немного громоздко и отрадно (предложенный Никитой Рыбаком) более прямолинейно.

Но есть утилита Apache BeanUtils, которая делает все трудолюбие внутренне, поэтому работа с бобами становится простой.

Добавить:

Если вы используете Reflection API, я хотел бы предложить вам аннотировать поля боба или ваши добытчик с аннотациями.

public class MyClassWith90Fields { 

    @XmlSerialize("name") 
    private String screenName; // shoudl serialize as <name>...</name> 

    @XmlSerialize 
    private String email; // shoud serialize as <email>...</email> 

    @XmlSerializeIgnore 
    pirvate boolean flag; // shoud not serialize as annotated as ignore 
} 

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.FIELD, ElementType.METHOD}) 
public @annotation XmlSerialize { 
    public String value; 
} 

После этого, ваша генерации кода может проверить (с помощью отражения) аннотированных поля и сериализации их в XML соответствующим образом.

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