У меня есть настройка, в которой я хочу иметь метод для обработки разных шаблонов отчетов (каждый шаблон имеет меньше/больше полей, чем другие), передавая имя отчета и создавая объект во время выполнения. Затем он должен проверить, существует ли каждое поле, и установить значение, если оно существует. Затем объект будет сериализован в 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());
}
}
Это будет один из различных видов отчетов.
public class CustomerReservationReportBasic extends CustomerReservationReport {
public CustomerReservationReportBasic() {
super();
}
}
Из Javadoc для Class::getDeclaredFields()
Возвращает массив объектов Field, отражающих все поля, объявленные классом или интерфейсом, представленным этим объектом класса. Сюда входят общедоступные, защищенные поля, доступ по умолчанию (пакет) и частные поля, но исключаются унаследованные поля.
Вам также нужно будет получить поля суперкласса (ов) объекта.