Отражение Java - Доступ к полям поля - PullRequest
0 голосов
/ 11 ноября 2010

Предположим, у меня есть класс

class car
{
       int color = 1;
       seats carSeats = new seats();

       class seats
       {
              int numSeats = 4;
       }
}

Используя отражение Java, я могу использовать следующее:

car c = new car();
Field[] carFields = c.getClass().getDeclaredFields();

carFields будет иметь в качестве полей {color, carSeats}. Экземпляр, carSeats, имеет другое поле с именем numSeats.

Технически, я должен быть в состоянии сделать еще одну операцию getFields (), такую:

Field[] seatFields = carFields[1].getClass().getDeclaredFields();

Но мне дают данные для мусора (ОБЪЯВЛЕНО, ОБЩЕСТВЕННЫЕ?) Почему так? Разве отражение Java не работает для внутренних классов?

Ответы [ 3 ]

5 голосов
/ 11 ноября 2010

carFields[1].getClass() будет представлять Field объект. Вы хотите carFields[1].getType().getDeclaredFields().

Также, как прокомментировал BalusC, будьте осторожны. Поля не обязательно должны быть в том порядке, в котором вы ожидаете.

0 голосов
/ 21 декабря 2017

Вы можете использовать Traverser класс java-util библиотеки, которая пересекает каждое поле класса с поддержкой вложенных полей, что вам и нужно.

Traverser - Передайте любой объект Java этому классу Utility, он будет вызывать ваш переданный в анонимном методе для каждого объекта, с которым он сталкивается, при обходе полного графа.Он обрабатывает циклы в графе.Позволяет выполнять обобщенные действия для всех объектов в графе объектов.

0 голосов
/ 11 ноября 2010

Вот короткий фрагмент, который может дать некоторые подсказки по Reflection

import java.lang.reflect.Field;

Общественный автомобиль класса {

int color = 1;
int wheels = 4;
Seats carSeats = new Seats();

class Seats {
    int numSeats = 4;
}

public static void printFields(Field[] fields, Object o) {
    System.out.println(o.getClass());
    try {
        for (int i = 0; i < fields.length; i++) {
            Field f = fields[i];
            f.setAccessible(true);
            System.out.println(f.getName() + " " + 
                    f.getType().getName()  + " " + 
                    f.get(o));

        }
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

public static void main(String args[]) {
    Car car = new Car();
    Class<?>[] classes = Car.class.getDeclaredClasses();

    printFields(Car.class.getDeclaredFields(), car);
    for (int i = 0; i < classes.length; i++) {
        Class<?> klass = classes[i];
        printFields(klass.getDeclaredFields(), car.carSeats);
    }
}

}

Мне нравится использовать код для написания кода, который использует отражение, но при этом трудно снимать проблемы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...