判断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