如何优雅的判断一个对象的属性是否全部为空
2023-09-27 14:28:31 时间
有一些业务场景下,我们需要判断某个对象的属性是否全部为空。该怎么做呢?
马上能想到的一个方案是,一个一个判断对象中的属性。这个倒也可以,但是如果要判断的对象比较多,就得给每个对象写一个判断方法(因为每个对象的属性都不一样)。
其实我们可以利用 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。所以需要判断是否为空的对象的属性尽量不要使用基本类型。
相关文章
- Lodop打印项对象类型属性区分
- 增量处理属性之记录模式(Record Modes)
- java list分组 list里面分装的都是对象 按照对象的属性来分组
- WPF 自定义依赖属性
- Android中Activity的android:windowSoftInputMode属性
- mybatis查询返回的对象不为null,但是属性值为null
- Python self,init,对象属性
- js中 给json对象添加属性和json数组添加元素
- cxgrid属性说明
- css display属性详解
- BeanUtils.copyProperties方法复制不同对象间的属性值
- 使用 jQuery 选择器获取页面元素,然后利用 jQuery 对象的 css() 方法设置其 display 样式属性,从而实现显示和隐藏效果。
- 使用 jQuery对象设置页面中 <ul> 元素的标记类型,并使用 DOM 对象设置 <li> 元素的浮动属性和右边距。使用jQuery 对象和 DOM 对象设置页面元素属性
- iOS - 如何深拷贝Array内元素、自定义对象、及自定义对象的属性(下)
- 属性和字段的区别和联系
- javascript对象constructor属性
- Jquery怎么获取select选中项 自定义属性的值
- JavaScript中的CSS属性对照表
- effective C#之 - 使用属性代替成员变量
- HTML DOM对象的属性和方法介绍(原生JS方法)
- 图解 Google V8 # 15:隐藏类:如何在内存中快速查找对象属性?
- java获取properties配置文件中某个属性最简单方法
- 类-描述器-把类对象方法转变为属性方式
- WPF 关于将 ManipulationDeltaEventArgs 的 Manipulators 属性返回值修改为 ReadOnlyCollection 类型的提议
- 读 MAUI 源代码 理解可绑定对象和可绑定属性的存储机制