每次寫博客都不知道咋開頭...算了_ 直接說問題吧。就是驗證一個對象中的一個屬性的值是否為空。
自己在網上也找到了很多大神給的答案,有看到利用反射機制
public boolean checkObjFieldIsNull(Object obj) throws IllegalAccessException { boolean flag = false; for(Field f : obj.getClass().getDeclaredFields()){ f.setAccessible(true); log.info(f.getName()); if(f.get(obj) == null){ flag = true; return flag; } } return flag; }
上面這一段代碼,可以檢驗這個對象中是否有空值,但我想要的結果是判斷其中的一個屬性是否為空。顯然這段神奇的代碼解決不了問題。
問題顯然已經說清楚了,下面說一下答案!
首先我需要檢驗的對象是一個Student類,並且Student類繼承了Person類。代碼如下所示
public class Person { //姓名 private String name; //性別 private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", sex='" + sex + '\'' + '}'; } }
public class student extends Person { //學號 private String snum; // 學院 private String scoll; // 班級 private String sclass; public String getSnum() { return snum; } public void setSnum(String snum) { this.snum = snum; } public String getScoll() { return scoll; } public void setScoll(String scoll) { this.scoll = scoll; } public String getSclass() { return sclass; } public void setSclass(String sclass) { this.sclass = sclass; } @Override public String toString() { return "student{" + "snum='" + snum + '\'' + ", scoll='" + scoll + '\'' + ", sclass='" + sclass + '\'' + '}'; } }
前方高能
public class Test { public static void main(String[] args) { student student = new student(); student.setName("這是姓名");//父類中的屬性 student.setSnum("這是學號"); Map<String, Object> map = objToMap(student); System.out.println(null == map.get("name"));//不是空 System.out.println(null == map.get("age"));//是空的 System.out.println(null == map.get("snum"));//不是空的 System.out.println(null == map.get("scoll"));//是空的 }
//將對象轉成map private static Map<String, Object> objToMap(Object obj) { Map<String, Object> map = new HashMap<String, Object>(); // 獲取f對象對應類中的所有屬性域 Field[] fields = getAllFields(obj); for (int i = 0, len = fields.length; i < len; i++) { String varName = fields[i].getName(); varName = varName.toLowerCase();//將key置為小寫,默認為對象的屬性 try { // 獲取原來的訪問控制權限 boolean accessFlag = fields[i].isAccessible(); // 修改訪問控制權限 fields[i].setAccessible(true); // 獲取在對象f中屬性fields[i]對應的對象中的變量 Object o = fields[i].get(obj); if (o != null) map.put(varName, o.toString()); // System.out.println("傳入的對象中包含一個如下的變量:" + varName + " = " + o); // 恢復訪問控制權限 fields[i].setAccessible(accessFlag); } catch (IllegalArgumentException ex) { ex.printStackTrace(); } catch (IllegalAccessException ex) { ex.printStackTrace(); } } return map; }
/** * 返回對象的Field(包括私有的和父類的) */ public static Field[] getAllFields(Object object) { Class clazz = object.getClass(); List<Field> fieldList = new ArrayList<>(); while (clazz != null) { fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields()))); clazz = clazz.getSuperclass(); } Field[] fields = new Field[fieldList.size()]; fieldList.toArray(fields); return fields; }
解釋一下:我先將一個對象轉換成了一個map,然后通過key返回值判斷是否為空,在這里使用objToMap()
將對象轉換成map,因為我的這個對象是集成的Person類,(通過getClass()方法來獲取類的定義信息,通過定義信息再調用getFields()方法來獲取類的所有公共屬性,或者調用getDeclaredFields()方法來獲取類的所有屬性,包括公共,保護,私有,默認的方法,但是這里有一點要注意的是這個方法只能獲取當前類里面顯示定義的屬性),所以我有使用了getAllFields()
獲取一個對象的所有屬性。
運行程序得到結果為
false true false true