我有一个设置,我想有一个方法来处理不同的报表模板(每个模板比其他模板有更少/更多的字段),通过传入报表名称并在运行时创建对象。然后检查每个字段是否存在,如果存在则设置值。然后将对象序列化为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();
}
}
1条答案
按热度按时间csbfibhn1#
来自javadoc的
Class::getDeclaredFields()
返回字段对象数组,该数组反映由该类对象表示的类或接口声明的所有字段。这包括public、protected、default(package)access和private字段,但不包括继承的字段。您还需要获取对象超类的字段。