有一些业务场景下,我们需要判断某个对象的属性是否全部为空。该怎么做呢?

马上能想到的一个方案是,一个一个判断对象中的属性。这个倒也可以,但是如果要判断的对象比较多,就得给每个对象写一个判断方法(因为每个对象的属性都不一样)。

其实我们可以利用 java 的反射机制,比较优雅的实现。代码其实也很简单,

public class ObjectIsNullUitl {public static boolean checkFieldAllNull(Object object) throws IllegalAccessException {for (Field f : object.getClass().getDeclaredFields()) {System.out.println("name:" + f.getName());f.setAccessible(true);if (Modifier.isFinal(f.getModifiers()) && Modifier.isStatic(f.getModifiers())) {continue;}if (!isEmpty(f.get(object))) {return false;}f.setAccessible(false);}//父类public属性for (Field f : object.getClass().getFields()) {System.out.println("name:" + f.getName());f.setAccessible(true);if (Modifier.isFinal(f.getModifiers()) && Modifier.isStatic(f.getModifiers())) {continue;}if (!isEmpty(f.get(object))) {return false;}f.setAccessible(false);}return true;}private static boolean isEmpty(Object object) {if (object == null) {return true;}if (object instanceof String && (object.toString().equals(""))) {return true;}if (object instanceof Collection && ((Collection) object).isEmpty()) {return true;}if (object instanceof Map && ((Map) object).isEmpty()) {return true;}if (object instanceof Object[] && ((Object[]) object).length == 0) {return true;}return false;}
}

简单说下原理,

isEmpty 方法除了对象本身的null判断之外,还会根据对象的实际类型特殊判断,比如String类型,大部分业务场景下空串("")也是无意义的,和null可以等效处理。

另外,这里并没有加Number类型(Integer,Byte等包装类型的父类),这个主要是考虑到不同的业务场景对于“空值”的定义不一样,不好统一处理。

if (Modifier.isFinal(f.getModifiers()) && Modifier.isStatic(f.getModifiers())) {continue;}

这一句是让检查忽略掉 final static 修饰的属性,当然这个如果你的业务场景不需要,也可以不加。

然后我们准备一个测试类,

public class Model extends BaseModel{private String property1;private Integer property2;private List<String> property3;
}
public static void main(String[] args) throws InterruptedException, IllegalAccessException {Model model = new Model();boolean ret = ObjectIsNullUitl.checkFieldAllNull(model);System.out.println("ret:" + ret);}

输出的结果是true,因为我们确实没有给 model 对象的属性赋值。

这里其实有个坑需要特别注意。属性如果有基本类型(int,byte 等),即使不赋值,判断的结果也永远是 false。这是因为基本类型会有默认值(比如 int 默认值是0),在反射的过程中基本类型会变成包装类型,那么 int 就会变成 Integer 对象,并且对象的 intvalue 是0。所以需要判断是否为空的对象的属性尽量不要使用基本类型。

如何优雅的判断一个对象的属性是否全部为空相关推荐

  1. java工具类-判断一个对象中属性是否为null 或空字符串

    判断该对象是否为空对象 import cn.com.hwqh.user.entity.model.User;import java.lang.reflect.Field;/***判断该对象是否: 返回 ...

  2. JavaScript 判断对象中属性的值是否空,如果为空,则删除该属性

    前后端联调时,后端要求把空字段都过滤掉,所以就只能额外处理一下: let obj = {a: 1,b: 2,c: '',d: '',e: null,f: undefined } function fi ...

  3. 一个对象的属性_【前端冷知识】如何判断一个对象的某个属性是可写的?

    这是一个咋一听好像很简单,但是实际上却没那么简单,而且是很有趣的问题. 我们先来看一下什么情况下一个对象的属性是可写的. "属性可写"这个概念并没有严谨的定义,我们这里先来规定一下 ...

  4. java 判断对象的属性是否为空,如何判断一个对象里的属性是否都为空的

    怎么判断一个对象里的属性是否都为空的 怎么判断一个对象里的属性是否都为空的,或者判断该对象是否是一个实体! ------解决方案-------------------- 引用:怎么判断一个对象里的属性 ...

  5. JS如何判断一个对象是否为空、是否有某个属性

    一.JS判断一个对象是否为空 方法一: let obj1 = {} let obj2 = {a:1} function empty(obj){for (let key in obj){return f ...

  6. python判断一个对象是否为空的方法_python使用any判断一个对象是否为空的方法

    "python"判断字符串是否为空用什么方法? s为字符串 s.isalnum() 所有字符都是数字或者字母 s.isalpha() 所有字符都是字母 s.isdigit() 所有 ...

  7. jquery 判断一个对象是否存在

    jQuery 代码判断一个对象是否存在: ***********************错误*********************** if($("#id")){}else{} ...

  8. 七种垃圾收集器和垃圾回收、分代收集、GCROOTS相关概念、GC如何判断一个对象可以被回收

    文章目录 垃圾收集器概述 垃圾回收算法 1)标记-清除算法(Mark-Sweep)(DVM 使用的算法) 2)复制算法(Copying) 3)标记-整理算法(Mark-Compact) 4)分代收集( ...

  9. 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC

    36.JVM内存分哪几个区,每个区的作用是什么? 37.如和判断一个对象是否存活?(或者GC对象的判定方法) 38.简述java垃圾回收机制? 39.java中垃圾收集的方法有哪些? 40.java类 ...

最新文章

  1. 2019 ICPC Asia Nanjing Regional K.Triangle(求一个能将三角形分成两个面积相同的线段、计算几何)
  2. linux让数值依次递增的快捷键,如何将文件名批量修改成上一级文件夹的名字。如:A(文件夹名)-01这样依次递增?...
  3. EC笔记:第二部分:11:在operator=中处理“自我赋值”
  4. 推荐10款非常有用的 Ajax 插件
  5. java 数据队列_Java 数据结构 - 队列
  6. 2021年1月DB-Engines流行度排行:Snowflake五倍跃迁 Azure SQL云数据库倍增
  7. Java基础篇:如何使用continue语句
  8. OS学习笔记32—使用Storyboard实现复杂界面
  9. [ActionScript 3.0] 通过as3操作web内容
  10. Excel 2011 显示被隐藏的第一行
  11. 30岁萌妹子当电工,在抖音做网红,在电商平台当卖家
  12. 查看电脑内存个数、主频(工作频率)、容量、位宽等的方法总结
  13. du 查看文件大小命令
  14. 嵌入式系统基础及知识及接口技术总结
  15. 虚拟与现实!深兰科技打造湖北首个街区数字主理人「江妮」
  16. jdk8-时间API
  17. 双色球1-7号球统计系统
  18. STM32的全系列MCU的ID号的地址及读取方法
  19. C++面向对象程序设计 024:这是什么鬼delete ---- (北大Mooc)
  20. caged系统pdf_经度之战.PDF

热门文章

  1. 屏蔽google adsense和百度推广的广告
  2. STM32CUBEIDE使用说明
  3. wlop作品集_【图包】【wlop】作品合集
  4. XPO永久删除记录方法
  5. 旷视科技——身份验证、活体检测、人脸比对
  6. Angularjs之模块(angular.module('myApp', [])参数)
  7. 利用信号量机制实现前驱关系
  8. 温莎计算机应用硕士是针对国际学生的吗,专业推荐 | 加拿大留学,温莎大学英语计算机专业了解一下...
  9. 如何用 Node.js 实现一个简单的 Websocket 服务?
  10. asp.net 获得根文件夹在服务器上物理路径,asp.net获取网站目录物理路径示例