Java 判斷一個(gè)對(duì)象中某一個(gè)屬性的值是否為空

每次寫博客都不知道咋開頭...算了_ 直接說(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,740評(píng)論 18 399
  • 誰(shuí)的等待 恰逢花開 半世傾城 許你溫柔以待 ——題記 松枝披著輕紗 ...
    七遇閱讀 851評(píng)論 0 1
  • 生命太渺小,幸福卻太觸手可及,可是我沒能好好珍惜。 不知道這是否只是自己一個(gè)人的觸動(dòng),愈發(fā)生命渺小,時(shí)間更是少的可...
    清澄屋閱讀 362評(píng)論 0 1
  • 每當(dāng)有人想起我時(shí),我都很開心??墒堑弥皇菫榱饲笾谖?,才偶然想起我來(lái),心又涼了。就像滿懷希望,到頭又滿滿的失...
    親愛的爸爸媽媽閱讀 195評(píng)論 0 0
  • 之前介紹了springboot使用security進(jìn)行權(quán)限管理,這篇文件介紹一下springboot使用shiro...
    dalaoyang閱讀 1,515評(píng)論 7 38

友情鏈接更多精彩內(nèi)容