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<String> 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<String> getHobbies() {
return hobbies;
} public void setHobbies(List<String> hobbies) {
this.hobbies = hobbies;
} public boolean isStudent() {
return isStudent;
} public void setStudent(boolean isStudent) {
this.isStudent = isStudent;
} }

一、简单判断:

//判断1  : 这里会返回 true
User 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; /**
* <p>Description: 判断对象是否为空,进一步判断对象中的属性是否都为空 </p>
* @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;

/**
* <p>Description:测试对象判空 </p>
* @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<String> 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<String> getHobbies() {
return hobbies;
} public void setHobbies(List<String> 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;

/**
* <p>Description:测试对象判空 </p>
* @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<String> 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<String> getHobbies() {
return hobbies;
} public void setHobbies(List<String> hobbies) {
this.hobbies = hobbies;
} }

测试类3:

package com.chinalife.utils;

import org.junit.Test;

import com.chinalife.proposal.common.util.CheckObjectIsNullUtils;

/**
* <p>Description:测试对象判空 </p>
* @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类型的属性时 ,你要处理好是否要忽略这个两种类型的值。

Java判断对象是否为NULL的更多相关文章

  1. Java判断对象是否为Null/空

    package com.taiping.test; import java.lang.reflect.Field; import java.lang.reflect.Type; /** * <p ...

  2. JAVA 判断对象内容是否含有空值

    简单判断对象是否含有NULL值,以及信息描述. package com.sicdt.sicsign.bill.api.util; import java.lang.reflect.Invocation ...

  3. Java判断对象类型是否为数组

    判断对象是否为数组: public static void main(String[] args) { String[] a = ["1","2"]; if(a ...

  4. Guava API学习之Optional 判断对象是否为null

    java.lang.NullPointerException,只要敢自称Java程序员,那对这个异常就再熟悉不过了.为了防止抛出这个异常,我们经常会写出这样的代码: Person person = p ...

  5. java 判断对象是否是某个类的类型两种方法

    第一种: instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: resul ...

  6. JavaScript判断对象是否是NULL

    这个方法是我踩了很多坑之后找到的,对数组等类型的对象都很好使,果断收藏! function isEmpty(obj) { // 检验 undefined 和 null if (!obj &&a ...

  7. Extjs 判断对象是非为null或者为空字符串

    Ext.isEmpty(str,[allowEmptyString]) 如果str为 null undefined a zero-length array a zero-length string ( ...

  8. Assert.IsNotNull 方法(判断对象不为NULL)

    Assert.IsNotNull 方法 Visual Studio 2012   其他版本 Visual Studio 2010 Visual Studio 2008 Visual Studio 20 ...

  9. JavaScript判断对象是否是NULL(转)

    写js经常会遇到非空判断,看了你不就像风一样的文章 自己没有做总结,特地转载.很有帮助 function isEmpty(obj) { // 检验 undefined 和 null if (!obj ...

随机推荐

  1. ssh连接docker镜像ubuntu与debian

    用密码登录root docker官网给的sshdemo是ubuntu的,https://docs.docker.com/engine/examples/running_ssh_service/   亲 ...

  2. Codefroces 958C2 - Encryption (medium)

    C2 - Encryption (medium) 思路: 传统的dp: dp[i][j] 表示到第i个位置为止,分成j段的最大值 dp[i][j] = max(dp[l][j-1] + (sum[i] ...

  3. 第 8 章 容器网络 - 061 - flannel 的连通与隔离

    flannel 的连通与隔离 测试 bbox1 和 bbxo2 的连通性: bbox1 能够 ping 到位于不同 subnet 的 bbox2,通过 traceroute 分析一下 bbox1 到 ...

  4. Java类成员变量的默认值

    1.布尔型(boolean)变量默认值为false,byte.short.int.long为0,字符型为'\u0000'(空字符),浮点型(float double)为0.0,引用类型(String) ...

  5. C#如何实现类似QQ那样靠边隐藏的功能

    http://www.cnblogs.com/yechensi/archive/2009/08/02/1537145.html C#如何实现类似QQ那样靠边隐藏的功能 你想过为自己的程序添加靠边隐藏的 ...

  6. php 中文字符串反转

    /** * * 中文字符串倒序 * @param str $str * return str **/ function str_en_desc($str){ $len=mb_strlen($str); ...

  7. 2-sat学习笔记

    前后缀建图 例:要求n个变量满足至多有1个为true. 暴力:一个点的true向其它n-1个点的false连边,复杂度O(n^2). 正解:prei表示前i个点是否有真. prei的true向prei ...

  8. 最长回文字串——manacher算法

    时间复杂度:O(n) 参考:https://segmentfault.com/a/1190000003914228 1.问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 如果一个字 ...

  9. Tree总结

    树结构问题因为容易写出解法,因此经常出现在面试题中 1. 树的种类 1) Tree 2) Binary Trees 3) Binary Search Trees(BST) : used to sort ...

  10. Fox And Dinner CodeForces - 510E (最大流)

    大意: n只狐狸, 要求分成若干个环, 每个环的狐狸不少于三只, 相邻狐狸年龄和为素数. 狐狸年龄都>=2, 那么素数一定为奇数, 相邻必须是一奇一偶, 也就是一个二分图, 源点向奇数点连容量为 ...