设计思路如下:
所有的操作是通过TestDemo类调用EmpActiob类的主要作用是在于定位要操作的属性类型,同时该程序符合所有简单的Java类开发形式,所以用一个单独的类(BeanOperation)实现此适配。
如:
Emp类设计:
package vo;
public class Emp{
private String name;
private String job;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
@Override
public String toString() {
return "Emp [name=" + name + ", job=" + job + "]";
}
}
EmpAction类设计:
package vo;
import vo.BeanOperation;
public class EmpAction{
private Emp emp = new Emp();
public void setValue(String value) throws Exception {
BeanOperation.setBeanValue(this, value);
}
public Emp getEmp() {
return emp;
}
}
BeanOperation类设计(公共程序类):
package vo;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
//本类负责自动的vo匹配操作
public class BeanOperation{
private BeanOperation() {}
//负责设置类中的属性操作
//actionObject 表示当前发出设置请求的程序类的当前对象
//msg 属性的具体内容,格式为 emp.name:小明|emp.job:学生
public static void setBeanValue(Object actionObject,String msg) throws Exception {
//要想进行内容的设置,必须将字符串拆分
//按照竖线拆分,取出所有要设置的内容
String[] result = msg.split("\\|");
//每次执行后只剩下 emp.name:小明
for(int i = 0;i < result.length;i++) {
//按照:进行拆分
String[] temp = result[i].split(":");
// emp.name
String attribute = temp[0];
//小明
String value = temp[1];
String[] fields = attribute.split("\\.");
//获取当前操作的简单Java类对象
Object currentObject = getObject(actionObject,fields[0]);
//调用简单Java类的setter方法
setObjectValue(currentObject,fields[1],value);
}
}
//将给定字符串的首字母大写
//msg 给定的字符串
//return 返回首字母大写的字符串
public static String initCap(String msg) {
return msg.substring(0, 1).toUpperCase() + msg.substring(1);
}
//负责调用EmpAction类中的getter方法取得简单Java类对象
//obj 表示调用方法的所在类对象
//attribute 表示属性名称
//return 调用对象结果
public static Object getObject(Object obj,String attribute) throws Exception {
//调用指定的Field对象,目的是取得对象类型,如果没有此属性意味着操作无法继续进行
Field field = obj.getClass().getDeclaredField(attribute);
if(field == null) {
//第二次尝试从父类中取得该属性
field = obj.getClass().getField(attribute);
}
if(field == null) {
//两次都未取得指定属性的对象,表示该对象一定不存在
return null;
}
String methodName = "get" + initCap(attribute);
Method method = obj.getClass().getMethod(methodName);
return method.invoke(obj);
}
//根据指定的类对象设置指定类中的属性,调用setter方法
//obj 属性所在类的实例化对象
//attribute 属性名称
//value 属性内容
public static void setObjectValue(Object obj,String attribute,String value) throws Exception{
Field field = obj.getClass().getDeclaredField(attribute);
//判断属性是否存在
if(field == null) {
//第二次尝试从父类中取得该属性
field = obj.getClass().getField(attribute);
}
if(field == null) {
//两次都未取得指定属性的对象,表示该对象一定不存在
return;
}
String methodName = "set" + initCap(attribute);
Method method = obj.getClass().getMethod(methodName,field.getType());
method.invoke(obj, value);
}
}
Test类设计:
package vo;
public class Test{
public static void main(String[] args) throws Exception{
String value = "emp.name:小明|emp.job:学生";
EmpAction empAction = new EmpAction();
empAction.setValue(value);
System.out.println(empAction.getEmp());
}
}