開發與維運

單級屬性賦值 | 帶你學《Java語言高級特性》之九十一

上一篇:屬性自動賦值實現思路 | 帶你學《Java語言高級特性》之九十
【本節目標】
本節需要掌握需要通過反射進行指定類對象的實例化處理,進行內容的設置(Field屬性類型、方法名稱、要設置的內容)。

單級屬性配置

對於此時的Emp類中會發現所給出的數據類型都沒有其他的引用關聯了,只是描述了Empty本類的對象,所以這樣的設置稱為單級設置處理,所以此時應該處理兩件事情:

  • 需要通過反射進行指定類對象的實例化處理;
  • 進行內容的設置(Field屬性類型、方法名稱、要設置的內容);

image.png
反射與簡單Java類

1、定義StringUtils實現首字母大寫功能

class StringUtils {
    public static String initcap(String str) {
        if (str == null || "".equals(str)) {
            return str;
        }
        if (str.length() == 1) {
            return str.toUpperCase();
        }else {
        return str.substring(0, 1).toUpperCase() + str.substring(1);
        }
    }
}

2、定義BeanUtils工具類,該工具類主要實現屬性的設置。

class BeanUtils{   //進行Bean處理的類
    private BeanUtils(){}
    /**
     * 實現指定對象的屬性設置
     * @param obj 要進行反射操作的實例化對象
     * @param value 包含有指定內容的字符串,格式"屬性:內容|屬性:內容"
     */
    public static void setValue(Object obj,String value){
        String results [] = value.split("\\|");//按照"|"進行每一組屬性的拆分
        for (int x = 0; x < results.length; x ++) {   //循環設置屬性內容
            //attval [0]保存的是屬性名稱,attval [1]保存的是屬性內容
            String attval [] = results[x].split(":");   //獲取“屬性名稱”和內容
            try {
                Field field = obj.getClass().getDeclaredField(attval[0]);  //獲取成員
                Method setMethod = obj.getClass().getDeclaredMethod("set" + StringUtils.initcap(attval [0]), field.getType());
                setMethod.invoke(obj, attval [1]);  //調用setter方法設置內容
            }catch (Exception e) {}
        }
    }
}

3、ClassInstanceFactory負責實例化對象並且調用BeanUtils類實現屬性內容的設置。

class ClassInstanceFactory{
    private ClassInstanceFactory(){}

    /**
     * 實例化對象的創建方法,該對象可以根據傳入的字符串結構:"屬性:內容|屬性:內容"
     * @param clazz 要進行反射實例化的Class對象,有Class就可以反射實例化對象
     * @param value 要設置給對象的屬性內容
     * @return 一個已經配置好屬性內容的Java對象
     */
    public static <T> T create(Class<?> clazz,String value){
        // 如果要想採用反射進行簡單Java類對象屬性設置的時候,類中必須要有無參構造
        try {
            Object obj = clazz.getDeclaredConstructor().newInstance();
            BeanUtils.setValue();   //通過反射設置屬性
            return (T) obj; //返回對象
        }catch (Exception e) {
            e.printStackTrace();  //如果此時真的出現了錯誤,本質上拋出異常也沒用
            return null;
        }    
    }
}

即使類中的屬性再多,那麼也可以輕鬆的實現setter的調用(類對象實例化處理)。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。
本內容視頻來源於阿里雲大學

更多Java面向對象編程文章查看此處

Leave a Reply

Your email address will not be published. Required fields are marked *