java-反射單級VO操作

java-反射單級VO操作

主要用於一次可以設置多個屬性值;

例如我們現在定義一個Person類,裏面有姓名和年齡屬性;如果我們調用set來設置屬性,要設置兩次,如果人數增多並且屬性值不是兩個就要多次調用set方法;

例子


class Emp{
    private String name;
    private String dept;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDept() {
        return dept;
    }

    public void setDept(String dept) {
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "name='" + name + '\'' +
                ", dept='" + dept + '\'' +
                '}';
    }
}

現在有需求要一次性設置這兩個值 傳入 屬性1:xxx|屬性2:xxx

首先創建一個EmpAction類,這個類是真實交給用戶操作的類

class EmpAction{
    private Emp emp=new Emp();
    public  void setValue(String name) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        BeanUtil.setValue(this,name);
    }

    public Emp getEmp() {
        return emp;
    }
}

還有一個工具類,是設置值的類

class BeanUtil{
    /*
    * 傳入:
    * emp.name:HaHa|emp.dept: 上班
    * */
    public static void setValue(Object obj,String name) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
        String[] value=name.split("\\|");
        for(int i=0;i<value.length;i++){
            //屬性值HaHa
            String realValue=value[i].split(":")[1];
            //類名 emp
            String objectValue=value[i].split(":")[0].split("\\.")[0];
            //屬性名 name
            String objectName=value[i].split(":")[0].split("\\.")[1];
            Object objectAction=getObject(obj,objectValue);
            setValueObject(objectAction,objectName,realValue);

        }
    }
    public static Object getObject(Object obj,String objectValue) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
        Class cls=obj.getClass();
        String str="get"+spellName(objectValue);
        Method method=cls.getMethod(str);
        return method.invoke(obj);
    }
    public static void setValueObject(Object obj,String objectName,String value) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
            Class cls=obj.getClass();
            String str = "set"+spellName(objectName);
            Method method=cls.getMethod(str,String.class);
            method.invoke(obj,value);

    }
    public static String spellName(String name){
        return name.substring(0,1).toUpperCase()+name.substring(1);
    }
}
public class Test {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        String str="name:託尼|job:造型師";
      EmpAction empAction=new EmpAction();
      empAction.setValue(str);
        System.out.println(empAction.getEmp());

    }
}

這樣就可以一次性設置多個值

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