首页 > 其他分享 >统计对象中包含属性值和对象,所有空值数量

统计对象中包含属性值和对象,所有空值数量

时间:2024-11-27 10:38:11浏览次数:4  
标签:String 对象 class Address clazz 空值 address public 属性

要统计一个Java实体类中所有空值(包括对象属性和基本类型/包装器类型的值)的数量,可以使用反射来遍历类的所有字段,并递归地检查对象属性。下面提供了一个示例代码,展示了如何实现这一功能。

假设我们有一个实体类Person,它包含一些基本类型属性、字符串属性以及另一个对象类型的属性(例如Address)。我们将编写一个方法来统计这些属性中的空值数量。

首先定义实体类:

public class Address {
    private String street;
    private String city;

    // 构造函数、getters 和 setters 省略

    public Address() {}

    public Address(String street, String city) {
        this.street = street;
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }
}

public class Person {
    private String name;
    private Integer age;
    private Address address;

    // 构造函数、getters 和 setters 省略

    public Person() {}

    public Person(String name, Integer age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

  接下来是用于统计空值的方法:

import java.lang.reflect.Field;
import java.util.Objects;

public class NullFieldCounter {

    public static int countNullFields(Object obj) throws IllegalAccessException {
        if (obj == null) {
            return 1; // 如果传入的对象本身就是null,则直接返回1
        }

        int nullCount = 0;
        Class<?> clazz = obj.getClass();
        
        while (clazz != null) {
            for (Field field : clazz.getDeclaredFields()) {
                field.setAccessible(true);
                Object fieldValue = field.get(obj);

                if (fieldValue == null) {
                    nullCount++;
                } else if (fieldValue instanceof Iterable) {
                    // 如果是集合类型,可以进一步处理
                    for (Object item : (Iterable<?>) fieldValue) {
                        nullCount += countNullFields(item); // 递归处理集合中的每个元素
                    }
                } else if (field.getType().isPrimitive() || isWrapperType(field.getType())) {
                    continue; // 基本类型或其包装类,不为空
                } else {
                    nullCount += countNullFields(fieldValue); // 递归处理对象属性
                }
            }
            clazz = clazz.getSuperclass(); // 处理父类
        }

        return nullCount;
    }
/**
* 判断是否是基本类型
* @param clazz
* @return
*/
private static boolean isWrapperType(Class<?> clazz) { return clazz.equals(Boolean.class) || clazz.equals(Integer.class) || clazz.equals(Character.class) || clazz.equals(Byte.class) || clazz.equals(Short.class) || clazz.equals(Double.class) || clazz.equals(Long.class) || clazz.equals(Float.class) || clazz.equals(Void.class); } public static void main(String[] args) throws IllegalAccessException { Address address = new Address(null, "New York"); Person person = new Person("John", null, address); System.out.println("Number of null fields: " + countNullFields(person)); } }

  

这段代码实现了以下功能:

使用反射获取并访问类及其父类的所有字段。
检查每个字段是否为null。
对于非null的复杂对象字段,递归调用countNullFields方法继续检查。
对于集合类型,递归处理集合中的每个元素。
提供了对基本类型及其包装类的特殊处理。
通过这种方式,你可以有效地统计出一个实体类及其关联对象中所有空值的数量。

标签:String,对象,class,Address,clazz,空值,address,public,属性
From: https://www.cnblogs.com/xianz666/p/18571736

相关文章

  • java小工具封装- java 查询mysql/pg库 sql中所有属性和属性值
     封装类:传参数据库连接和查询的sql就可以打印出查询sql的所有属性和属性值(可直接复制粘贴使用)publicstaticvoidselectAll(Connectionconnection,Stringsql){ResultSetMetaDatarsmd=null;try{//trycatch判断是否有异常Statemen......
  • OpenHarmony属性信息怎么修改?触觉智能RK3566鸿蒙开发板来演示
    本文介绍在开源鸿蒙OpenHarmony系统下,修改产品属性信息的方法,触觉智能PurplePiOH鸿蒙开发板演示,搭载了瑞芯微RK3566四核处理器,Laval鸿蒙社区推荐开发板,已适配全新OpenHarmony5.0Release系统,感兴趣的小伙伴可以了解下!产品信息属性介绍在OpenHarmony系统图形化界面中,产品属性的......
  • 你有使用过preload、preconnect、prefetch这些属性吗?说说它们都有什么作用?
    是的,我了解preload、preconnect和prefetch这些前端性能优化相关的属性。它们各自作用如下:preload(预加载):preload是一种声明式的fetch,用于强制浏览器请求当前页面关键资源,并将其存储在缓存中,以便在需要时更快地使用。它告诉浏览器:“我确定稍后会需要这个资源,请尽快下......
  • 使用Lombok导致打印的tostring中缺少父类的属性
    背景实体类UserDtoextendsBaseEntity,两个类的上方都有标注,Lombok的@Data注解,但是使用时UserDto的实例对象调用toString方法时发现,只打印出来自身子类的属性信息,并没有打印出来父类的信息。@DatapublicclassUserDtoextendsBaseEntity{/***姓名*/@Tab......
  • 从零开始理解JVM:对象的生命周期之对象创建
    一、对象创建从你new一个对象开始,发生了什么?遇到new指令,jvm首先要做的事是检查有没有这个类,没有的话,加载它!接下来,就要进行实例的内存分配,通过什么样的方式进行内存分配呢?1、内存分配方式指针碰撞这种分配前提是内存中有整片连续的空间,用的在一边,空闲的在另一边,用一个指针......
  • Java基础-scanner对象
    scanner对象next():一定要读取到有效字符后才可以结束输入对输入有效字符之前遇到的空白,next()方法会自动将其去掉只有输入有效字符后才将其后面输入的空白作为分隔符或结束符next()不能得到带有空格的字符串//创建一个扫描器对象,用于接收键盘数据Scannerscanner=......
  • java面向对象知识点: 封装,构造,重载
    目录封装封装知识点private(私有)public(公共) 二、getter和setter方法getter方法(访问器方法)setter方法(修改器方法)三、封装类的设计原则单一职责原则高内聚性一.Java为什么要封装?一、数据隐藏与安全性保护数据不被随意访问防止外部干扰二、提高代码的可维......
  • 前端技术中对JavaScript对象的学习
    对象目录对象创建对象使用循环遍历对象属性对象中的方法创建对象创建新对象有两种不同的方法:使用Object定义并创建对象的实例。使用函数来定义对象,然后创建新的对象实例。newObject在JavaScript中,几乎所有的对象都是Object类型的实例,它们都会从Object.prototype......
  • Prometheus Operator自定义监控对象 -- Ingress-Nginx
    PrometheusOperator自定义监控对象--Ingress-Nginx一、自定义资源Prometheus-operator通过定期循环watchapiserver,获取到CRD资源(比如servicemonitor)的创建或者更新,将配置更新及时应用到运行中的prometheuspod中转换成标准promethesu配置文件供prometheusserver使用。各......
  • Jenkin window bat批处理脚本如何请求api,获取json对象返回值数据
    需求:在jenkins的windowsbat批处理脚本中,请求一个api返回json数据,然后获取返回值的某个指定key的value直接上脚本:cdC:\workspace\jenkinxx\workspace\job-ta-webgitcheckoutmastergitpulldir::使用curl请求APIcurl-shttp://xx.xx.xx.xx:8088/testapi/getData......