< java reflection>object.getclass().getdeclaredfields()为空

zed5wv10  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(629)

我有一个设置,我想有一个方法来处理不同的报表模板(每个模板比其他模板有更少/更多的字段),通过传入报表名称并在运行时创建对象。然后检查每个字段是否存在,如果存在则设置值。然后将对象序列化为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();
    }
}
csbfibhn

csbfibhn1#

来自javadoc的 Class::getDeclaredFields() 返回字段对象数组,该数组反映由该类对象表示的类或接口声明的所有字段。这包括public、protected、default(package)access和private字段,但不包括继承的字段。
您还需要获取对象超类的字段。

相关问题