Java判断对象是否为NULL 您所在的位置:网站首页 怎么判断object为空 Java判断对象是否为NULL

Java判断对象是否为NULL

2023-07-17 10:57| 来源: 网络整理| 查看: 265

Java使用反射判断对象是否为NULL

判断Java对象是否为null可以有两层含义:

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

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

 

被判断的Java对象: User (User.java)

package com.chinalife.utils; import java.util.List; public class User { private String name; //姓名 private String age; //年龄 private String sex; //性别 private List hobbies; // 爱好 private boolean isStudent; //是否是学生 public User(){} public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public List getHobbies() { return hobbies; } public void setHobbies(List hobbies) { this.hobbies = hobbies; } public boolean isStudent() { return isStudent; } public void setStudent(boolean isStudent) { this.isStudent = isStudent; } } View Code

 

一、简单判断:

//判断1 : 这里会返回 trueUser user = null; if(user == null){ return true; }else{ return false; } //判断2 : 这里会返回 false User user = new User(); if(user == null){ return true; }else{ return false; }

原因: User user = new User(); 这时候已经创建了一个对象,所以user不会为null

以上示例比较简单,一目了然,看起来没有任何问题。 

" 但是其实当你需要判断的对象为前端传过来的对象时,单纯的使用 object == null 去判断是不够的,因为前端传过来的对象会是 判断2 的样子。

对象不为null,但是对象的所有属性均为null。[boolean类型除外,以及序列化值除外,可能还有其他特殊值~ 欢迎补充哟] "

" " 所标识的内容如果不够清晰,请参考上一篇博客: https://www.cnblogs.com/DFX339/p/9896476.html 

 

二、进一步判断:

创建Util类,使用反射对对象的属性进行判断  

CheckObjectIsNullUtils.java

package com.chinalife.proposal.common.util; import java.lang.reflect.Field; import java.lang.reflect.Type; /** *

Description: 判断对象是否为空,进一步判断对象中的属性是否都为空

* @author duanfeixia * @date 2018年11月12日 */ public class CheckObjectIsNullUtils { /** * 判断对象是否为空,且对象的所有属性都为空 * ps: boolean类型会有默认值false 判断结果不会为null 会影响判断结果 * 序列化的默认值也会影响判断结果 * @param object * @return */ public 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; } }

 

1>>>首先我们测试一个含有boolean类型属性的对象判断  (被判断的User对象为文章最上方的User.java)

测试类1:

package com.chinalife.utils; import org.junit.Test; import com.chinalife.proposal.common.util.CheckObjectIsNullUtils; /** *

Description:测试对象判空

* @author duanfeixia * @date 2018年11月12日 */ public class CheckObjectIsNullUtilsTest { @Test public void testObjectCheck(){ CheckObjectIsNullUtils checkUtils= new CheckObjectIsNullUtils(); User user= new User(); boolean flag1 = checkUtils.objCheckIsNull(user); System.err.println("是否为空:"+flag1); } }

 

测试结果1:  【这里是受boolean类型值的影响,所以返回的结果为false】

 

2>>>接下来将User对象的boolean类型属性去掉,再测试User对象的判断

User.java 如下:

package com.chinalife.utils; import java.util.List; public class User { private String name; //姓名 private String age; //年龄 private String sex; //性别 private List hobbies; // 爱好 // private boolean isStudent; //是否是学生 public User(){} public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public List getHobbies() { return hobbies; } public void setHobbies(List hobbies) { this.hobbies = hobbies; } // public boolean isStudent() { // return isStudent; // } // // public void setStudent(boolean isStudent) { // this.isStudent = isStudent; // } }

测试类2:(和上面的一样)

package com.chinalife.utils; import org.junit.Test; import com.chinalife.proposal.common.util.CheckObjectIsNullUtils; /** *

Description:测试对象判空

* @author duanfeixia * @date 2018年11月12日 */ public class CheckObjectIsNullUtilsTest { @Test public void testObjectCheck(){ CheckObjectIsNullUtils checkUtils= new CheckObjectIsNullUtils(); User user= new User(); boolean flag1 = checkUtils.objCheckIsNull(user); System.err.println("是否为空:"+flag1); } }

 

 测试结果2: 【返回的是true,因为注释掉了Boolean类型的属性】

 

这里需要注意的是数据类型: boolean与Boolean

boolean 定义的变量默认值为false,Boolean定义的变量默认值为 null.

ps: 在定义boolean类型变量时,最好不要使用 isXxx,因为默认生成的get方法就是 isXxx(), RPC框架在反向解析的时候,以为对应的属性名是 xxx,从而导致属性获取不到,抛出异常。

eg:定义boolean属性 boolean isSuccess;  

对应的boolean类型获取数据的方法:

public String isSuccess(){

  return isSuccess;

}

 

RPC框架在反向解析的时候,以为对应的属性名是 success 从而导致属性获取不到,抛出异常。

 

3>>>然后我们再来测试一下关于实实现序列化接口 Serializable 时的结果:

User.java 如下

package com.chinalife.utils; import java.util.List; //implements java.io.Serializable public class User implements java.io.Serializable { private static final long serialVersionUID = 1L; private String name; //姓名 private String age; //年龄 private String sex; //性别 private List hobbies; // 爱好 public User(){} public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public List getHobbies() { return hobbies; } public void setHobbies(List hobbies) { this.hobbies = hobbies; } }

测试类3:

package com.chinalife.utils; import org.junit.Test; import com.chinalife.proposal.common.util.CheckObjectIsNullUtils; /** *

Description:测试对象判空

* @author duanfeixia * @date 2018年11月12日 */ public class CheckObjectIsNullUtilsTest { @Test public void testObjectCheck(){ CheckObjectIsNullUtils checkUtils= new CheckObjectIsNullUtils(); User user= new User(); boolean flag1 = checkUtils.objCheckIsNull(user); System.err.println("是否为空:"+flag1); } }

 

测试结果3: 【结果为false,因为serialVersionUID有值】

 

综上所述,当你需要判断Java对象是否为null的时候,你可以先通过 obj == null 去判断,如果obj 不等于null,再根据业务需求决定是否需要进一步判断 obj的所有属性是否都为null。

主要方法是: CheckObjectIsNullUtils.java 类中所示的内容。

需要注意的是: 当你的对象 实现了序列化接口或者是含有boolean类型的属性时 ,你要处理好是否要忽略这个两种类型的值。

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有