反射与单级VO操作
先看一个基本程序
package www.bit.java.vo;
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 TestDemo {
public static void main(String[] args) {
Emp emp = new Emp() ;
emp.setEname("zhangsan") ;
emp.setJob("Java Coder") ;
System.out.println(emp);
}
}
假设一个类中存在有几十个属性,要按照原始做法,要调用几十次setter方法,这样操作就太麻烦了。现在希望能对程序做简化,输入字符串
“属性名称:属性值|属性名称:属性值|属性名称:属性值|….”,
就可以将类中的属性设置好。希望通过此程序实现任意的简单Java类的属性设置。
设计思路如下:
现在所有的操作是通过TestDemo类调用EmpAction类实现的,而EmpAction类的主要作用是在于定位要操作的属性类型。同时该程序应该符合于所有简单的Java类开发形式,因此对于我们的设计而言必须有一个单独的类(BeanOperation)实现此适配。
例:Emp类设计(简单Java类)
package test;
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 + "}";
}
}
例:EmpAction类设计
package test;
import bit.util.BeanOperation;
public class EmpAction {
private Emp emp = new Emp();
public void setValue(String value) throws Exception {
//this表示EmpAction的对象
BeanOperation.setBeanValue(this, value);
}
public Emp getEmp() {
return emp;
}
}
例:BeanOperation类设计(公共程序类)
package bit.util;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//此类通过反射来进行简单的java类的值插入
public class BeanOperation {
private BeanOperation() {}
//此方法用于给对象插入属性
//emp.ename:zhangsan|emp.job:Coder
public static void setBeanValue(Object obj, String data) throws NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//当前obj表示EmpAction对象
//第一次拆分
String[] result = data.split("\\|");
for (int i = 0; i < result.length; i++) {
//emp.ename:zhangsan
String[] temp = result[i].split(":");
//取得要插入的数据
String value = temp[1];
//取得具体className emp
String className = temp[0].split("\\.")[0];
//取得具体属性名
String fieldName = temp[0].split("\\.")[1];
Object realObject = getRealObject(obj, className);
//拿到具体操作的Emp类之后,开始调用具体的set方法来设置属性
Class<?> realClass = realObject.getClass();
Method setMethod = realClass.getDeclaredMethod("set" + initCap(fieldName), String.class);
setMethod.invoke(realObject, value);
}
}
//
private static Object getRealObject(Object obj, String className) throws NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//拿到EmpAcrion类的Class对象
Class<?> cls = obj.getClass();
Field field = cls.getDeclaredField(className);
//在当前类中没有找到此属性
if(field == null) {
//再从父类中找此属性
field = cls.getField(className);
if(field == null) {
return null;
}
}
//获取get属性名
String methodName = "get" + initCap(className);
Method getObjectMethod = cls.getDeclaredMethod(methodName);
//相当于调用empAction.getEmp();
return getObjectMethod.invoke(obj);
}
private static String initCap(String value) {
//将首字母大写然后返回
return value.substring(0, 1).toUpperCase()+value.substring(1);
}
}
例:测试类设计
package test;
public class Test {
public static void main(String[] args) throws Exception {
String value = "emp.ename:zhangsan|emp.job:Conder";
EmpAction empAction = new EmpAction();
empAction.setValue(value);
System.out.println(empAction.getEmp());
}
}
这是上述测试类的运行结果
扫描二维码关注公众号,回复:
998183 查看本文章