設置多種數據類型 | 帶你學《Java語言高級特性》之九十二

上一篇:單級屬性賦值 | 帶你學《Java語言高級特性》之九十一
【本節目標】
在實際的開發中面對簡單Java類中的屬性類型一般的可選為:long(Long)、int(Integer)、double(Double)、String、Date(日期、日期時間),我們需要實現各種數據類型的配置。

設置多種數據類型

現在已經成功的實現了單級的屬性配置,但是這裡面依然需要考慮一個實際的情況:當前所給定的數據類型只是String。在實際的開發中面對簡單Java類中的屬性類型一般的可選為:long(Long)、int(Integer)、double(Double)、String、Date(日期、日期時間),所以這時對於當前的程序代碼必須做出修改,要求可以實現各種數據類型的配置。

既然要求可以實現不同類型的內容設置,並且BeanUtils類主要是完成屬性賦值處理的,那麼就可以在這個類中追加一系列的處理方法。

import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class JavaAPIDemo {
    public static void main(String[] args)throws Exception{
        String value="empno:7369|ename:Smith|job:Clerk|salary:750.00|hiredate:1989-10-10";
        Emp emp = ClassInstanceFactory.create(Emp.class, value);
        System.out.println("僱員編號:" + emp.getEmpno() + "、姓名:" + emp.getEname() + "、職位:" + emp.getJob() + "、基本工資:" + emp.getSalary() + "、受僱日期:" + emp.getHiredate());
    }
}
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;
        }    
    }
}
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);
        }
    }
}
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());
                Object convertValue = BeanUtils.convertAttributeValue(field.getType().getName(), attval[1]);
                setMethod.invoke(obj, convertValue);  //調用setter方法設置內容
            }catch (Exception e) {
            }
        }
    }
    /**
     * 實現屬性類型轉換處理
     * @param type 屬性類型,通過Field獲取
     * @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 ("int".equals(type) || "java.lang.int".equals(type)) {
            return Integer.parseInt(value);
        }else if ("double".equals(type) || "java.lang.double".equals(type)) {
            return Integer.parseDouble(value);
        }else if ("java.util.Date".equals(type)) {
            SimpleDateFormat sdf = null;
            if (value.matches("\\d{4}-\\d{2}-\\d{2}") {  //日期類型
                sdf = new SimpleDateFormat("yyyy-MM-dd");
            } else if (value.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}") {
                sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            }else {
                return new Date() ;   //當前日期
            }
            try {
                return sdf.parse(value);
            } catch(ParseException e) {
                return new Date() ;   //當前日期
            }
        }else {
            return value;
        }
    }
}

class Emp{
    private long empno;
    private String ename;
    private String job;
    private double salary;
    private Date hiredate;
    public void setEname(String ename) {
        this.ename = ename;
    }
    public void setJob(String job) {
        this.job = job;
    }
    public String getEname() {
        return ename;
    }
    public String getJob() {
        return job;
    }
    public long getEmpno() {
        return empno;
    }
    public void setEmpno(Long empno) {
        this.empno = empno;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
    public Date getHiredate() {
        return hiredate;
    }
    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }
}

執行結果:
image.png

此時只是列舉了常用幾種數據類型,如果要將其作為產品推廣,必須要考慮所有可能出現的類型,同時也要考慮所有可能會出現的日期格式。

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

下一篇:級聯對象實例化 | 帶你學《Java語言高級特性》之九十三
更多Java面向對象編程文章查看此處

Leave a Comment

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

Scroll to Top