java自定义检查对象属性是否为空

简介: java自定义检查对象属性是否为空

一、需求

@Data
public class Student {
    /**
     * id
     */
    private Long id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 性别
     */
    private Integer sex;
    /**
     * 民族
     */
    private Integer nation;
}

有一个学生对象,有ID、姓名、性别、民族四个属性。业务1推展需要,学员姓名、性别、名族不能为空;业务2、需要学员的姓名、性别不能为空;

为什么不让学员都填了?实际业务中属性可能几十项,数据略微敏感,我们只在单一业务需要的时候,找学员提供。

二、检查工具类

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
 
public class FieldUtils {
    public static List<String> checkObjFieldIsNull(Object obj, List<String> checkField) throws IllegalAccessException {
 
        List<String> res = new ArrayList<>();
        //获取对象的类
        Class<?> aClass = obj.getClass();
        //获取对象的所有字段,包含public、private和proteced
        Field[] declaredFields = aClass.getDeclaredFields();
        //遍历对象的所有属性
        for (Field field : declaredFields) {
            //反射的对象在使用时应该取消 Java 语言访问检查,提高性能
            field.setAccessible(true);
            String fieldName = field.getName();
            //检查是对象属性是否是受检对象
            if (checkField.contains(fieldName)) {
                //受检对象是否是空
                if (field.get(obj) == null) {
                    res.add(fieldName);
                }
                 //字符串类型的空字符串判断
                Class<?> type = field.getType();
                 if ((String)field.get(obj)=="") {
                   res.add(fieldName);
                  }
            }
        }
        return res;
    }
}

三、实例代码

 @Test
    void test01() throws IllegalAccessException {
        Student st = new Student();
        st.setName("张三");
        st.setId(5L);
        System.out.println("学员信息:"+JSON.toJSONString(st));
        List<String> checkField01 = Arrays.asList("name", "sex", "nation");
        List<String> nullFieldList01 = FieldUtils.checkObjFieldIsNull(st, checkField01);
        System.out.println("业务检查字段:"+JSON.toJSONString(checkField01)+"检查为空字段:"+JSON.toJSONString(nullFieldList01));
 
        List<String> checkField02 = Arrays.asList("name", "sex");
        List<String> nullFieldList02 = FieldUtils.checkObjFieldIsNull(st, checkField02);
        System.out.println("业务检查字段:"+JSON.toJSONString(checkField02)+"检查为空字段:"+JSON.toJSONString(nullFieldList02));
    }


学员信息:{"id":5,"name":"张三"}
业务检查字段:["name","sex","nation"]检查为空字段:["sex","nation"]
业务检查字段:["name","sex"]检查为空字段:["sex"]
相关文章
|
2月前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
81 1
|
2月前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
46 1
|
3月前
|
Java
让星星⭐月亮告诉你,自定义定时器和Java自带原生定时器
定时器是一种可以设置多个具有不同执行时间和间隔的任务的工具。本文介绍了定时器的基本概念、如何自定义实现一个定时器,以及Java原生定时器的使用方法,包括定义定时任务接口、实现任务、定义任务处理线程和使用Java的`Timer`与`TimerTask`类来管理和执行定时任务。
70 3
|
3天前
|
Java
java代码优化:判断内聚到实体对象中和构造上下文对象传递参数
通过两个常见的java后端实例场景探讨代码优化,代码不是优化出来的,而是设计出来的,我们永远不可能有专门的时间去做代码优化,优化和设计在平时
22 15
|
17天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
88 34
|
1月前
|
JSON 前端开发 JavaScript
Java属性为什么不能是is开头的boolean
在Java实体类中,阿里规约要求boolean属性不应以is开头。文章通过实际案例分析了isUpdate字段在JSON序列化过程中变为update的问题,并提供了自定义get方法或使用@JSONField注解两种解决方案,建议遵循规约避免此类问题。
Java属性为什么不能是is开头的boolean
|
2月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
3月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
68 17
|
2月前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
74 14