Как найти поля всех переменных-членов, содержащихся в Java-бине - PullRequest
1 голос
/ 16 марта 2012

Я хочу создать графический интерфейс с использованием Java, в котором пользователь может выбрать компонент, отредактировать его поля и затем добавить экземпляр созданного компонента в очередь.Мой вопрос, однако, о доступе к полям.У меня есть класс MyCompositeObject, который наследуется от MyParentObject.MyParentObject состоит из нескольких компонентов, каждый из которых состоит из нескольких компонентов.Класс MyCompositeObject также состоит из bean-компонентов.Я хочу найти все доступные поля в MyCompositeObject.

Class MyParentObject
{
    MyObjectOne fieldOne;
    MyObjectTwo fieldTwo;
    String name;
  ...
 }

 Class MyCompositeObject extends MyParentObject
 {
    MyObjectThree fieldThree;
    Integer number;
   ...
 }

 Class MyObjectThree
 {
     boolean aBoolean;
     MyObjectFour fieldFour;
   ...
 }

Я пытался использовать API-интерфейс BeanUtils, но я застрял, пытаясь получить поля всех компонентов-бинов.Я представляю себе глубинный поиск всех полей, к которым можно получить доступ из экземпляра MyCompositeObject.Например, это может включать, но не ограничиваться, полями: MyCompositeObject.fieldOne, MyCompositeObject.number, MyCompositeObject.fieldThree.aBoolean.

Я понял, когда пытался:

Fields[] allFields = BeanUtils.getFields(myCompositeObject);

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

1 Ответ

2 голосов
/ 01 октября 2012

Это какая-то боль, но вы должны идти в двух измерениях

yourBeanClass.getSuperclass(); (and recursively get all superclasses until Object)

и тогда вы можете получить поля каждого из них

eachClass.getDeclaredFields() NOT getFields so you can get all the private fields

Как только у вас есть каждое поле

field.getType() which returns the Class of that field

тогда, конечно, вам нужно снова пройти по цепочке суперклассов dudes, чтобы убедиться, что вы получите ВСЕ поля класса, включая поля в суперклассе

Когда у вас есть эта цепочка классов для этого поля, вы можете получить ее поля, повторив вышеизложенное .... да, jdk сделал это забавным !!!! Я бы хотел, чтобы у них был метод getAllDeclaredFields, поэтому мне не пришлось подниматься по иерархии суперклассов.

ВАЖНО: вам нужно вызвать field.setAccessible (true), чтобы вы могли читать и писать в него, когда это, кстати, частное поле !!!

Вот код, который получает все поля для класса, включая суперклассы.

private static List<Field> findAllFields(Class<?> metaClass) {
    List<Field[]> fields = new ArrayList<Field[]>();
    findFields(metaClass, fields);

    List<Field> allFields = new ArrayList<Field>();
    for(Field[] f : fields) {
        List<Field> asList = Arrays.asList(f);
        allFields.addAll(asList);
    }
    return allFields;
}

private static void findFields(Class metaClass2, List<Field[]> fields) {
    Class next = metaClass2;
    while(true) {
        Field[] f = next.getDeclaredFields();
        fields.add(f);
        next = next.getSuperclass();
        if(next.equals(Object.class))
            return;
    }
}

позже, Декан

...