当前位置: 首页 > 知识库问答 >
问题:

对象。getClass()。getDeclaredFields()为空

储仲渊
2023-03-14

我有一个设置,我想有一个方法来处理不同的报告模板(每个模板的字段比其他模板少/多),方法是传入报告名称并在运行时创建对象。然后检查每个字段是否存在,如果存在,则设置值。然后将对象序列化为JSON以返回。

我有一个测试设置如下。问题是我无法获取已创建对象的字段列表。物体。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();
    }
}

共有1个答案

花永昌
2023-03-14

类::getDeclaredFields()

返回字段对象数组,该数组反映由该类对象表示的类或接口声明的所有字段。这包括公共、受保护、默认(包)访问和私有字段,但不包括继承的字段。

您还需要获取对象超类的字段。

 类似资料:
  • 我有一个Java类来表示数据库中的一个条目。所以每个字段都是数据库中的一列。 当我想更新该数据库时,我会构造一个ContentValures对象。 是 速度快于 的绝对性能是什么?我希望有人能真正指出是如何工作的。我知道容器的大小调整是如何工作的,但我对如何工作以及如何执行一无所知。

  • 问题内容: 我有一些调用的代码。 不过,这将返回null。 当我从命令行而不是从Eclipse启动相同的代码时,它将返回一个类加载器。 我可以破解代码来做到这一点… 两者都被编译并使用相同的JVM运行。(我确定99.99%)。 任何人都知道为什么第一个会为类加载器返回null? 编辑: 我的问题是:“没有人知道为什么同一类通过Eclipse启动时会返回null,而从命令行加载时会返回类加载器。”

  • Javascript getClass() 函数 getClass() -- 返回一个 JavaObject 的 JavaClass。 语法: getClass( javaObject ); 参数说明: javaObject -- 一个 JavaObject 对象 返回值: javaObject 的 JavaClass 对象 说明: getClass() 函数可接受一个 JavaObject

  • 问题内容: 我看到使用和运算符超过运算符时性能有所提高。 有没有使用或使用的指南? 给定一个场景:我知道要匹配的确切类,即,(这些是最终类),等等。 使用操作员的做法不好吗? 问题答案: 和表现不同的原因是他们在做不同的事情。 测试左侧对象引用(LHS)是右侧类型(RHS)的实例 还是某个子类型 。 测试类型是否相同。 因此,建议您忽略性能问题,并使用可为您提供所需答案的替代方法。 使用操作员是不

  • 我是Java新手,我正在尝试实现一个链表(我知道有一个链表类用于此目的,但从头开始就可以让我理解该语言在内部是如何工作的) 在main方法中,我声明了4个节点并初始化了3个。链表的头节点设置为空。第一次使用参数head和newNode调用add函数时,head为null,所以我初始化head并将newNode的值赋给它。在main方法中,我希望head对象应该从add方法中设置新的值。但头仍然是空