java遍歷實體類的屬性和數據類型以及屬性值

和同學接了個外包的活,由於項目中很多地方要用到poi導出excel,而每次導出都要寫很多相同的代碼,因爲poi的cell.setCellValue();每次設置的都是不同實體bean的屬性值,導致代碼裏很多重複的值,我在想有沒有可以自動裝載bean的屬性及屬性值的方法。首先想到的肯定是反射,但是自己寫了一下沒寫出來,so上網查了一下,發現了這個方法,感覺不錯,就記錄下來了。原文鏈接http://blog.csdn.net/dongzhouzhou/article/details/8446782


原文的代碼如下

    /**
     * 遍歷實體類的屬性和數據類型以及屬性值
     * @param model
     * @throws NoSuchMethodException
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     * @throws InvocationTargetException
     */
    public static void reflectTest(Object model) throws NoSuchMethodException,
                    IllegalAccessException, IllegalArgumentException,
                    InvocationTargetException {
        // 獲取實體類的所有屬性,返回Field數組
        Field[] field = model.getClass().getDeclaredFields();
        // 遍歷所有屬性
        for (int j = 0; j < field.length; j++) {
                // 獲取屬性的名字
                String name = field[j].getName();
                // 將屬性的首字符大寫,方便構造get,set方法
                name = name.substring(0, 1).toUpperCase() + name.substring(1);
                // 獲取屬性的類型
                String type = field[j].getGenericType().toString();
                // 如果type是類類型,則前面包含"class ",後面跟類名
                System.out.println("屬性爲:" + name);
                if (type.equals("class java.lang.String")) {
                        Method m = model.getClass().getMethod("get" + name);
                        // 調用getter方法獲取屬性值
                        String value = (String) m.invoke(model);
                        System.out.println("數據類型爲:String");
                        if (value != null) {
                                System.out.println("屬性值爲:" + value);
                        } else {
                                System.out.println("屬性值爲:空");
                        }
                }
                if (type.equals("class java.lang.Integer")) {
                        Method m = model.getClass().getMethod("get" + name);
                        Integer value = (Integer) m.invoke(model);
                        System.out.println("數據類型爲:Integer");
                        if (value != null) {
                                System.out.println("屬性值爲:" + value);
                        } else {
                                System.out.println("屬性值爲:空");
                        }
                }
                if (type.equals("class java.lang.Short")) {
                        Method m = model.getClass().getMethod("get" + name);
                        Short value = (Short) m.invoke(model);
                        System.out.println("數據類型爲:Short");
                        if (value != null) {
                                System.out.println("屬性值爲:" + value);
                        } else {
                                System.out.println("屬性值爲:空");
                        }
                }
                if (type.equals("class java.lang.Double")) {
                        Method m = model.getClass().getMethod("get" + name);
                        Double value = (Double) m.invoke(model);
                        System.out.println("數據類型爲:Double");
                        if (value != null) {
                                System.out.println("屬性值爲:" + value);
                        } else {
                                System.out.println("屬性值爲:空");
                        }
                }
                if (type.equals("class java.lang.Boolean")) {
                        Method m = model.getClass().getMethod("get" + name);
                        Boolean value = (Boolean) m.invoke(model);
                        System.out.println("數據類型爲:Boolean");
                        if (value != null) {
                                System.out.println("屬性值爲:" + value);
                        } else {
                                System.out.println("屬性值爲:空");
                        }
                }
                if (type.equals("class java.util.Date")) {
                        Method m = model.getClass().getMethod("get" + name);
                        Date value = (Date) m.invoke(model);
                        System.out.println("數據類型爲:Date");
                        if (value != null) {
                                System.out.println("屬性值爲:" + value);
                        } else {
                                System.out.println("屬性值爲:空");
                        }
                }
        }
    }

由於我的實體bean裏有double類型,我又不想用其封裝類的方法獲取值,於是我在他的基礎上又加入了一段代碼,

                if (type.equals("double")) {
                    Method m = model.getClass().getMethod("get" + name);
                    double value = (double) m.invoke(model);
                    System.out.println("數據類型爲:double");
                    if (value >0) {
                            System.out.println("屬性值爲:" + value);
                    } else {
                            System.out.println("屬性值爲:空");
                    }
                }
                System.out.println("屬性類型爲:"+type);

這樣一來,就可以知道屬性類型是什麼,可以很好的加判斷語句了。當然原文代碼還有很多值得優化的地方,我這裏就沒有進行優化,準備等我將它與poi導出整合之後再來優化。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章