Java中利用反射去判断一个对象所有属性是否都为空

java 专栏收录该内容
48 篇文章 10 订阅

判断Java对象是否为null

第一种情况:  直接使用 object == null 去判断,对象为null的时候返回true,不为null的时候返回false。

第二种情况:在object != null 为true的情况 下,进一步去判断对象的所有属性是否为null。

被判断的类对象,随便写的一个

针对第一种情况,直接使用null进行比较即可

但是,只要学过java的人都知道,这个判断永远都是true,因为上面对象中定义了相应的属性,尽管对象的属性是空的,但是对象不为空,大多数情况我们都是想比较对象中的所有属性是否都为空。

这个时候,我们就可以用到java中的反射了,话不多说,直接上代码

package com.tensquare.article.controller;

import com.tensquare.article.pojo.Father;

import java.lang.reflect.Field;
import java.lang.reflect.Type;

/**
 * @Author: wlf
 * @Date: create in 2020/8/12 15:41
 * @Name:
 * @Function:
 * @Modified By:
 */
public class TestA {

    public static void main(String[] args) {
        Father father = new Father();
        if(objCheckIsNull(father)){
            System.out.println("对象中的所有属性都为空......");
        }
    }
    /**
     * 判断对象是否为空,且对象的所有属性都为空
     * ps: boolean类型会有默认值false 判断结果不会为null 会影响判断结果
     *     序列化的默认值也会影响判断结果
     * @param object
     * @return
     */
    public static  boolean objCheckIsNull(Object object){
        Class clazz = (Class)object.getClass(); // 得到类对象
        Field fields[] = clazz.getDeclaredFields(); // 得到所有属性
        boolean flag = true; //定义返回结果,默认为true
        for(Field field : fields){
            field.setAccessible(true);
            Object fieldValue = null;
            try {
                fieldValue = field.get(object); //得到属性值
                Type fieldType =field.getGenericType();//得到属性类型
                String fieldName = field.getName(); // 得到属性名
                System.out.println("属性类型:"+fieldType+",属性名:"+fieldName+",属性值:"+fieldValue);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            if(fieldValue != null){  //只要有一个属性值不为null 就返回false 表示对象不为null
                flag = false;
                break;
            }
        }
        return flag;
    }

}

以上代码运行一下,可以得出以下结果。

然后可以尝试随便给个属性赋值,这个方法都会校验出来这个对象的属性的值是否为空,但是也有特殊情况,下面我们就来分析一下都有哪些情况

PS:注意注意,敲黑板了。都坐好了、

第一种情况:对象中存在基本数据类型的时候,需要把基本数据类型转成相应的包装类型,即装箱操作

举个例子:对象中存在boolean属性的时候,由于boolean默认值是false,所以会导致方法判断对象都不为空,

方法判断该对象都不是空的,

针对着这种情况我们可以使用Boolean来替换掉boolean就好了

可以看到改成包装类之后,已经可以了

这边顺便说下8中基本数据类型中的默认值

byte: 0

short:    0

int :       0

long:     0L

float:     0.0f

double: 0.0d

char:    \u0000(空, ")

boolean: false

 

 

 

  • 0
    点赞
  • 1
    评论
  • 6
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 1 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

这辈子_安静的努力着

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值