Java使用反射判斷對象是否為NULL
第一層: 直接使用 object== null去判斷,對象為null的時候傳回true,不為null的時候傳回false。
第二層:在object!= null為true的情況 下,進一步去判斷對象的所有屬性是否為null--------------------------------------------------------
//判斷1 : 這裡會傳回 true
User user = null;if(user == null){return true;
}else{return false;
}//判斷2 : 這裡會傳回 false
User user = newUser();if(user == null){return true;
}else{return false;
}
原因: User user= newUser(); 這時候已經建立了一個對象,是以user不會為null---------------------------------------------------------------------------對象不為null,但是對象的所有屬性均為null。[boolean類型除外,以及序列化值除外
進一步判斷
建立Util類,使用反射對對象的屬性進行判斷 CheckObjectIsNullUtils.javapackagecom.chinalife.proposal.common.util;importjava.lang.reflect.Field;importjava.lang.reflect.Type;
public classCheckObjectIsNullUtils {
public booleanobjCheckIsNull(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;
}
}returnflag;
}
}
測試public classCheckObjectIsNullUtilsTest {
@Testpublic voidtestObjectCheck(){
CheckObjectIsNullUtils checkUtils= newCheckObjectIsNullUtils();
User user= newUser();boolean flag1 =checkUtils.objCheckIsNull(user);
System.err.println("是否為空:"+flag1);
}
}------------------------------------------------------注意boolean 定義的變量預設值為false,Boolean定義的變量預設值為 null.
在判斷對象是否為空時需要注意類是否含有boolean成員變量 和 類是否實作序列化接口,
boolean會有預設值,導緻判斷時傳回false
類一旦實作了序列化接口,就會存在serialVersionUID屬性有值,導緻判斷傳回false