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());
}
}
這樣就可以一次性設置多個值