每次寫博客都不知道咋開頭...算了_ 直接說(shuō)問(wèn)題吧。就是驗(yàn)證一個(gè)對(duì)象中的一個(gè)屬性的值是否為空。
自己在網(wǎng)上也找到了很多大神給的答案,有看到利用反射機(jī)制
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;
}
上面這一段代碼,可以檢驗(yàn)這個(gè)對(duì)象中是否有空值,但我想要的結(jié)果是判斷其中的一個(gè)屬性是否為空。顯然這段神奇的代碼解決不了問(wèn)題。
問(wèn)題顯然已經(jīng)說(shuō)清楚了,下面說(shuō)一下答案!
首先我需要檢驗(yàn)的對(duì)象是一個(gè)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 {
//學(xué)號(hào)
private String snum;
// 學(xué)院
private String scoll;
// 班級(jí)
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("這是學(xué)號(hào)");
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"));//是空的
}
//將對(duì)象轉(zhuǎn)成map
private static Map<String, Object> objToMap(Object obj) {
Map<String, Object> map = new HashMap<String, Object>();
// 獲取f對(duì)象對(duì)應(yīng)類中的所有屬性域
Field[] fields = getAllFields(obj);
for (int i = 0, len = fields.length; i < len; i++) {
String varName = fields[i].getName();
varName = varName.toLowerCase();//將key置為小寫,默認(rèn)為對(duì)象的屬性
try {
// 獲取原來(lái)的訪問(wèn)控制權(quán)限
boolean accessFlag = fields[i].isAccessible();
// 修改訪問(wèn)控制權(quán)限
fields[i].setAccessible(true);
// 獲取在對(duì)象f中屬性fields[i]對(duì)應(yīng)的對(duì)象中的變量
Object o = fields[i].get(obj);
if (o != null)
map.put(varName, o.toString());
// System.out.println("傳入的對(duì)象中包含一個(gè)如下的變量:" + varName + " = " + o);
// 恢復(fù)訪問(wèn)控制權(quán)限
fields[i].setAccessible(accessFlag);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
}
}
return map;
}
/**
* 返回對(duì)象的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;
}
}
解釋一下:我先將一個(gè)對(duì)象轉(zhuǎn)換成了一個(gè)map,然后通過(guò)key返回值判斷是否為空,在這里使用objToMap()將對(duì)象轉(zhuǎn)換成map,因?yàn)槲业倪@個(gè)對(duì)象是集成的Person類,(通過(guò)getClass()方法來(lái)獲取類的定義信息,通過(guò)定義信息再調(diào)用getFields()方法來(lái)獲取類的所有公共屬性,或者調(diào)用getDeclaredFields()方法來(lái)獲取類的所有屬性,包括公共,保護(hù),私有,默認(rèn)的方法,但是這里有一點(diǎn)要注意的是這個(gè)方法只能獲取當(dāng)前類里面顯示定義的屬性),所以我有使用了getAllFields()獲取一個(gè)對(duì)象的所有屬性。
運(yùn)行程序得到結(jié)果為
false
true
false
true