<Отражение Java> object.getClass().getDeclaredFields() пусто

У меня есть настройка, в которой я хочу иметь метод для обработки разных шаблонов отчетов (каждый шаблон имеет меньше/больше полей, чем другие), передавая имя отчета и создавая объект во время выполнения. Затем он должен проверить, существует ли каждое поле, и установить значение, если оно существует. Затем объект будет сериализован в JSON для возврата.

У меня есть тестовая установка, как показано ниже. Проблема в том, что я не могу получить список полей созданного объекта. object.getClass().getDeclaredFields() всегда дает пустой массив.

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

Основная логика:

import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;

public class Test {

    public static void main(String[] args)
            throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException,
            InvocationTargetException, NoSuchMethodException, SecurityException {
        Class<?> cls = Class.forName("CustomerReservationReportBasic");
        CustomerReservationReport customerReservationReport = (CustomerReservationReport) cls.getDeclaredConstructor()
                .newInstance();
        System.out.println(hasField(customerReservationReport, "name"));
    }

    public static boolean hasField(Object object, String fieldName) {
        return Arrays.stream(object.getClass().getDeclaredFields()).anyMatch(f -> f.getName().equals(fieldName));
    }
}

Модель:

Отчет о бронировании клиента

Это родительский класс, и здесь находятся все основные поля отчета.

import java.math.BigDecimal;

import lombok.Data;

@Data
public abstract class CustomerReservationReport implements Comparable<CustomerReservationReport> {

    private String name;
    private int num_of_visit;
    private BigDecimal total_spend;

    @Override
    public int compareTo(CustomerReservationReport customerReservationReport) {
        return this.getName().compareTo(customerReservationReport.getName());
    }
}

CustomerReservationReportBasic

Это будет один из различных видов отчетов.

public class CustomerReservationReportBasic extends CustomerReservationReport {
    public CustomerReservationReportBasic() {
        super();
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 048
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из Javadoc для Class::getDeclaredFields()

Возвращает массив объектов Field, отражающих все поля, объявленные классом или интерфейсом, представленным этим объектом класса. Сюда входят общедоступные, защищенные поля, доступ по умолчанию (пакет) и частные поля, но исключаются унаследованные поля.

Вам также нужно будет получить поля суперкласса (ов) объекта.

Другие вопросы по теме