Java 反射給類的屬性賦值,取代 setter

在這裏插入圖片描述
實現思路:
在這裏插入圖片描述
代碼:

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author liujunao
 * @description 用於給 bean 賦值,避免繁瑣 setter
 * 注意:只能對 String,Integer,Long,Double,Boolean 且 setter 方法首字母大寫對 bean 屬性賦值
 */
public class BeanSetterUtil {

    /**
     * 實現 bean 屬性賦值
     *
     * @param clazz
     * @param value
     * @param <T>
     * @return
     */
    public static <T> T create(Class<T> clazz, String value) {
        //類中必須要有無參構造器
        Object obj = null;
        try {
            obj = clazz.getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //設置屬性
        setValue(obj, value);
        return (T) obj;
    }

    /**
     * 屬性賦值
     *
     * @param obj
     * @param value
     */
    private static void setValue(Object obj, String value) {
        String[] str = value.split("\\|");//按照|拆分字符串
        for (int i = 0; i < str.length; i++) {
            String[] s = str[i].split(":");
            //s[0]保存的是屬性名稱,s[1]保存的是屬性內容
            try {
                Field field = obj.getClass().getDeclaredField(s[0]);
                Method method = obj.getClass().getDeclaredMethod("set" + initCap(s[0]), field.getType());
                Object valueObj = convertAttributeValue(field.getType().getName(), s[1]);
                if (valueObj != null) {
                    method.invoke(obj, valueObj);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 參數類型轉換
     * 注意:只能處理基本類型 --> String,Integer,Long,Double,Boolean
     *
     * @param type
     * @param value
     * @return
     */
    private static Object convertAttributeValue(String type, String value) {
        if ("long".equals(type) || "java.lang.Long".equals(type)) {
            return Long.parseLong(value);
        } else if ("double".equals(type) || "java.lang.Double".equals(type)) {
            return Double.parseDouble(value);
        } else if ("String".equals(type) || "java.lang.String".equals(type)) {
            return String.valueOf(value);
        } else if ("int".equals(type) || "java.lang.Integer".equals(type)) {
            return Integer.parseInt(value);
        } else if ("boolean".equals(type) || "java.lang.Boolean".equals(type)) {
            return Boolean.parseBoolean(value);
        } else {
            return null;
        }
    }

    /**
     * 首字母大寫
     *
     * @param str
     * @return
     */
    private 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);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章