Java判斷對象是否為NULL


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;
    }
    
}
View Code

 

一、簡單判斷:

//判斷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類型的屬性時 ,你要處理好是否要忽略這個兩種類型的值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM