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 {View Codeprivate 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() { returnhobbies; } 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型別的屬性】
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型別的屬性時 ,你要處理好是否要忽略這個兩種型別的值。