现在有一个简单的Java类,按照原始的做法进行Setter和getter属性操作
原始做法:
class Emp{
private String ename;
private String job;
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
@Override
public String toString(){
return "Emp{"+"ename='"+ename+"\'"+",job='"+job+"\'"+"}";
}
}
public class Test1Emp {
public static void main(String[] args) {
Emp emp= new Emp();
emp.getEname();
emp.getJob();
emp.setEname("Hello");
emp.setJob("java coder");
System.out.println(emp);
}
}
假设一个类有十几个属性,按照原始的做法,就会显得很麻烦,那么我们有没有办法让属性很多的类操作起来更方便呢?答案是:当然有.
现在希望能对程序做简化,输入字符串"属性名称:属性值|属性名称:属性值|属性名称:属性值......",就可以将属性设置好,设计思路如下:
以上的思路其实就是单级VO操作
1.单级VO操作
VO: value object,值对象,使用一个值作为数据的存储与传递
VO一般是用于值的存储与传递,目前这里用的值是字符串
2.Emp类
这里以Emp为例
package www.bit.java.vo;
public class Emp {
private String ename ;
private String job ;
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
@Override
public String toString() {
return "Emp{" +
"ename='" + ename + '\'' +
", job='" + job + '\'' +
'}';
}
}
3.EmpAction类设计
EmpAction类的主要作用是在于定位要操作的属性类型。同时该程序应该符合于所有简单的Java类开发形式,因此对于我们的设计而言必须有一个单独的类(BeanOperation)(实现此适配)。
package www.bit.java.vo;
import www.bit.java.util.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 ;
}
}
4.BeanOperation类设计
单级VO的核心操作
package reflect;
/**
* Author:weiwei
* description:
* Creat:${Date}
**/
import javax.swing.tree.ExpandVetoException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 本类主要负责实现自动的VO匹配处理操作
*/
public class BeanOperation {
private BeanOperation() {
}
/**
* 负责类中的属性操作
*
* @param actionObject 表示当前发出设置请求的程序类的当前对象
* @param msg 属性的具体内容,格式为:"属性名称:|内容|属性名称:|内容...."
*/
public static void setBeanValue(Object actionObject, String msg) throws Exception {
//要想进行内容的设置,必须将字符串拆分
//按照竖线拆分,取出所有要设置的内容
String[] result = msg.split("\\|");
//每次执行后只剩下"属性名称:内容"
for (int i = 0; i < result.length; i++) {
//需要对属性名称及内容做进一步拆分
String[] temp = result[i].split(":");
//属性名称"emp.ename"
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], temp[1]);
}
}
/**
* 将给定字符串的首字母大写
*
* @param str 给定的字符串
* @return 返回首字母大写的字符串
*/
public static String initCap(String str) {
return str.substring(0, 1).toUpperCase() + str.substring(1);
}
/**
* 负责调用XXXAction类中的gettter方法取得简单的Java类对象
*
* @param obj 表示调用方法的所在类对象
* @param attribute 表示属性名称
* @return 调用对象结果
*/
public static Object getObject(Object obj, String attribute) throws Exception {
String methodName = "get" + initCap(attribute);
//调用指定属性的Filed对象,目前是取得对象类型如果没有此属性意味着操作无法进行
Field field = obj.getClass().getDeclaredField(attribute);
if (field == null) {
//第二次尝试从父类中取得该属性
field = obj.getClass().getField(attribute);
}
if (field == null) {
//两次都未取得指定属性的对象,表示该对象一定不存在
return null;
}
Method method = obj.getClass().getMethod(methodName);
return method.invoke(obj);
}
/**
* 根据指定的类对象设置指定类中的属性,调用setter方法
*
* @param obj 属性所在类的实例化对象
* @param attribute 属性名称
* @param 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 setMethod = obj.getClass().getMethod(methodName, field.getType());
setMethod.invoke(obj, value);
}
}
5.Test测试类
package www.bit.java.vo;
public class TestDemo {
public static void main(String[] args) throws Exception {
String value = "emp.ename:yuisama|emp.job:Java Coder" ;
EmpAction empAction = new EmpAction() ;
empAction.setValue(value) ;
System.out.println(empAction.getEmp());
}
}