要求:传入一个固定格式字符串:“属性名称:值|属性名称:值”,能正确设置对应的值,最后按固定格式输出。实际操作的类文件不需要更改变动,只需改动配置文件,则可以适应其他相似需求。
另外,为了简化,此时的值都为String类型。
关键字:简单Java类;反射
实现后的包&类如下:其中util包为核心操作,不需改动;vo和action是对应的实际业务类和连接类,根据需要更改配置;demo为最终请求发起测试类。
以雇员类为例,需要展示的属性为:name和job,传入字符串为:"emp.name:Simith|emp.job:Clerk"
一:设置Emp类,包括属性和setter,getter,toString方法
package com.java.vo;
public class Emp {
private String name;
private String job;
public Emp() {}
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;
}
public String toString() {
return "Emp [name=" + name + ", job=" + job + "]";
}
}
二:BeanOperation类
package com.java.util;
//本类主要负责实现自动的VO匹配处理操作。
//本身不需要实例化对象完成,所以构造私有。
public class BeanOperation {
private BeanOperation() {}
public static void setBeanValue(Object actionBean,String value) throws Exception {
//拆分为ename和job
String[] arr = value.split("\\|");
for (int i = 0; i < arr.length; i++) { //拆分为了:对象.属性名称:值
String[] temp = arr[i].split(":");
String attribute = temp[0]; //对象.属性名称
String content = temp[1]; //值
String[] field = attribute.split("\\.");
//取得当前的Emp对象
Object currentObject = ObjectUtils.getObjectValue(actionBean, field[0]);
//设置对应Emp对象的对应的属性值
ObjectUtils.setObjectValue(currentObject,field[1],content);
}
}
}
三:ObjectUtils类,取得当前对象:
package com.java.util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ObjectUtils {
private ObjectUtils() {}
public static Object getObjectValue(Object actionBean, String str) throws Exception {
String MethodName = "get"+StringUtils.initcap(str);
//确定EmpAction中是否存在对应的Emp对象属性
Field field = actionBean.getClass().getDeclaredField(str);
if(field == null) {
return null;
}
//通过反射调用EmpAction的getEmp方法,取得当前的Emp对象
Method method = actionBean.getClass().getMethod(MethodName);
return method.invoke(actionBean);
}
public static void setObjectValue(Object currentObject,String fieldName,String content) throws Exception{
String reName = StringUtils.initcap(fieldName);
Field field = currentObject.getClass().getDeclaredField(fieldName);
if(field == null) {
return;
}
Method setMethod = currentObject.getClass().getMethod("set"+reName,field.getType());
setMethod.invoke(currentObject,content);
}
}
四:StringUtils类,负责字符串的统一处理
package com.java.util;
public class StringUtils {
private StringUtils() {}
public static String initcap(String str) {
return str.substring(0, 1).toUpperCase()+str.substring(1);
}
}
五:EmpAction类
package com.java.action;
import com.java.util.BeanOperation;
import com.java.vo.Emp;
public class EmpAction {
private Emp emp = new Emp();
public void setValue(String value) {
//之所以要传递this,主要是将EmpAction类的对象传递到方法去
//因为给定的字段是:“emp.ename:value”,而emp对应的是getEmp()方法
try {
BeanOperation.setBeanValue(this, value);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Emp getEmp() {
return emp;
}
}
六:TestDemo类
package com.java.demo;
import com.java.action.EmpAction;
public class TestDemo {
public static void main(String[] args){
String value = "emp.name:Simith|emp.job:Clerk";
EmpAction empAction = new EmpAction();
empAction.setValue(value);
System.out.println(empAction.getEmp());
}
}
输出结果:Emp [name=Simith, job=Clerk]
如果现在有一个学生类,需要输出Student的姓名,年纪,只需配置StudentAction和Emp类,其他不用更改:
Student类:
package com.java.vo;
public class Student {
private String name;
private String grade;
public Student() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
@Override
public String toString() {
return "Student [name=" + name + ", grade=" + grade + "]";
}
}
StudentAction:
package com.java.action;
import com.java.util.BeanOperation;
import com.java.vo.Student;
public class StudentAction {
private Student student = new Student();
public void setValue(String value) {
//之所以要传递this,主要是将EmpAction类的对象传递到方法去
//因为给定的字段是:“emp.ename:value”,而emp对应的是getEmp()方法
try {
BeanOperation.setBeanValue(this, value);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Student getStudent() {
return student;
}
}
执行:
package com.java.demo;
import com.java.action.StudentAction;
public class TestStudentDemo {
public static void main(String[] args) {
String value = "student.name:滚滚|student.grade:一年级";
StudentAction empAction = new StudentAction();
empAction.setValue(value);
System.out.println(empAction.getStudent());
}
}
输出:Student [name=滚滚, grade=一年级]