首页 > 其他分享 >统计一个实体类及其父类、子类中所有空字段

统计一个实体类及其父类、子类中所有空字段

时间:2024-11-27 10:14:03浏览次数:5  
标签:实体类 子类 clazz field BaseEntity 父类 ChildEntity

使用反射:利用Java反射机制来获取类的所有字段,并检查这些字段是否为空。
递归遍历:如果需要同时考虑父类和子类,可以通过递归的方式遍历整个继承链。
处理访问限制:确保能够访问私有字段,可能需要调用setAccessible(true)方法。
下面是一个简单的示例代码,演示如何实现这个功能。假设我们有一个基类BaseEntity以及它的子类ChildEntity,并且你想统计这两个类中的空字段数量。

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class FieldNullCounter {

    public static int countNullFields(Object obj) throws IllegalAccessException {
        // 获取对象的实际类型
        Class<?> clazz = obj.getClass();
        // 用于存储所有字段
        List<Field> allFields = new ArrayList<>();
        
        // 收集当前类及其所有父类的字段
        while (clazz != null) {
            for (Field field : clazz.getDeclaredFields()) {
                allFields.add(field);
            }
            clazz = clazz.getSuperclass(); // 移动到父类
        }

        // 统计空字段数量
        int nullCount = 0;
        for (Field field : allFields) {
            field.setAccessible(true); // 设置可访问性
            if (field.get(obj) == null) {
                nullCount++;
            }
        }

        return nullCount;
    }

    public static void main(String[] args) throws IllegalAccessException {
        BaseEntity base = new BaseEntity();
        ChildEntity child = new ChildEntity();

        System.out.println("BaseEntity null fields: " + countNullFields(base));
        System.out.println("ChildEntity null fields: " + countNullFields(child));
    }
}

class BaseEntity {
    private String name;
    private Integer age;

    // getters and setters...
}

class ChildEntity extends BaseEntity {
    private String address;

    // getters and setters...
}

  

标签:实体类,子类,clazz,field,BaseEntity,父类,ChildEntity
From: https://www.cnblogs.com/xianz666/p/18571671

相关文章

  • 使用Lombok导致打印的tostring中缺少父类的属性
    背景实体类UserDtoextendsBaseEntity,两个类的上方都有标注,Lombok的@Data注解,但是使用时UserDto的实例对象调用toString方法时发现,只打印出来自身子类的属性信息,并没有打印出来父类的信息。@DatapublicclassUserDtoextendsBaseEntity{/***姓名*/@Tab......
  • 了解静态绑定,讨论对象调用的是父类的方法还是子类的方法
    #重写#重载结合以下两点进行展开探讨与实践:1)调用方法的对象存在两种引用类型:父类引用和本类引用2)方法中的形参类与传递进来的对象实例:形参类是对象类的父类、本类 1.业务对象本类引用调用方法,调用方法传递的对象引用是本类引用方法调用顺序:Service本类中有接收Messag......
  • Map集合中的具体子类TreeMap
    一、TreeMap元素是一个键值对,可以去重并进行排序1.先编写一个Dog2类publicclassDog2{privateStringname;privateintage;publicDog2(){}publicDog2(Stringname,intage){this.name=name;......
  • c# - - - json字符串获取值,json字符串转实体类
    json字符串获取值usingNewtonsoft.Json.Linq;usingSystem;namespaceConsoleApp1{classProgram{staticvoidMain(string[]args){Console.WriteLine("HelloWorld!");stringmStr="{\"shen......
  • 在多态的方法调用中为什么会出现“左边编译左边运行”的现象?多态创建的对象到底是谁属
    目录“左边编译左边运行”的两个原因:什么是“编译看左边,运行看右边”?为什么会出现“左边编译左边运行”现象?1.子类没有重写父类的方法2.重载与重写的混淆(重难点)问题:编译器是怎么看一个方法是重写还是重载的呢?区分方式:查看方法的签名如何避免“左边编译左边运行”的......
  • 织梦在导航栏下拉菜单中怎么调用当前栏目子类
    在织梦CMS(DEDECMS)中,要在导航栏的下拉菜单中调用当前栏目的子类,可以使用channelartlist标签来实现。下面是如何实现这一功能的具体步骤:步骤1:使用channelartlist标签在织梦CMS中,可以利用channelartlist标签来调用当前栏目的子类。下面是一个示例代码:<ul>{dede:cha......
  • java父类、子类构造函数调用过程
    java父类、子类构造函数调用过程由此看出java类初始化时构造函数调用顺序:初始化对象的存储空间为零或null值;按顺序分别调用父类成员变量和实例成员变量的初始化表达式;调用父类构造函数;(如果实用super()方法指定具体的某个父类构造函数则使用指定的那个父类构造函数)按顺序分别......
  • 用父类的对象引用子类对象中重写的方法 静态方法重写
    用父类的对象引用子类对象中重写的或继承的方法比如,以下程序中,Shape是抽象类,Circle和Rectangle是子类,均重写了抽象方法//定义抽象类publicabstractclassShape{//定义2个抽象方法publicabstractdoubleGetArea();publicabstractdoubleGetCircum();//定义普通方法p......
  • 使用AtomicInteger原子类尝试优化分析
    1.使用AtomicInteger原子类尝试优化分析Java的java.util.concurrent.atomic包提供了一些原子类,可以在并发编程中避免显式加锁。最简单的我们可以使用AtomicInteger来替代显式的锁。packageorg.zyf.javabasic.thread.lock.opti;importjava.util.concurrent.atomic.AtomicInteger......
  • 【好用小方法】随机生成n个汉字/数字转汉字/字符串去重/list数组去重/获取2的幂次方/
    /***根据参数生成n个中文汉字**@paramnum*@return*/publicstaticList<String>getChaineseList(intnum,List<String>aa){if(num<=0)returnaa;Stringword="";if(aa.size()>0){for(Strings:aa)......