反射与简单Java类
需要先了解:
>反射与工厂模式之间不可告人的秘密<
>反射-我要窥探类中的世界<
在所有开发框架中都有反射的身影,没有反射就没有开发框架。
反射与单级VO操作
如果现在有一个简单java类,按照原始的做法是用getter、setter对属性进行操作,看起来并没什么问题,但是当有几十个属性,无疑是个麻烦的操作。所以通过反射操作VO,实现将输入的格式如:”属性名称:属性值|属性名称:属性值|属性名称:属性值|….”的字符串操作
基本程序:Emp类设计(简单Java类)
package reflect;
/**
* 简单java类
* @author Logicr
*
*/
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 + "]";
}
}
EmoAction类
package reflect;
/**
* @author Logicr
*
*/
public class EmpAction {
private Emp emp = new Emp();
public void setValue(String value) throws Exception {
//this是本类
BeanOperation.setBeanvalue(this, value);
}
public Emp getEmp() {
return emp;
}
}
BeanOperation类(公共程序类)
package reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author Logicr
*负责自动实现自动的VO匹配处理操作
*/
public class BeanOperation {
private BeanOperation() {}
/**
* @param actionObject 表示当前发出设置请求的程序的当前对象?
* @param msg "emp.ename:Jan|emp.job:Student"
* @throws Exception
*/
public static void setBeanvalue(Object actionObject ,String msg) throws Exception {
//进行拆分
String [] result = msg.split("\\|");
for (int i = 0; i < result.length; i++) {
String [] tmp = result[i].split(":");
String attribute = tmp[0];//属性名称
// String value = tmp [1];//内容
String [] fields = attribute.split("\\.");//
//获取类对象,fields[0]:emp
Object currentObject = getObject(actionObject,fields[0]);
//调用setter方法 fields[1] = ename , tmp[1] = Jan;
setObject(currentObject, fields[1], tmp[1]);
}
}
/**
* 首字母大写操作,构造setter、getter方法的名字
* @param str
* @return
*/
public static String initCap(String str) {
return str.substring(0, 1).toUpperCase()+str.substring(1);
}
/**
* @param obj 调用方法所在的类对象
* @param attribute 属性名称
* @return
* @throws Exception
*/
public static Object getObject(Object obj,String attribute) throws Exception{
String methodName = "get"+initCap(attribute);
//取得类对象
Field field = obj.getClass().getDeclaredField(attribute);
if (field == null) {
field = obj.getClass().getField(attribute);
}
if (field == null) {
return null;
}
//取得getter方法
Method method = obj.getClass().getMethod(methodName);
//调用返回
return method.invoke(obj);
}
/**
* 设置对象属性
* @param obj 对象
* @param attribute 属性名称
* @param valve 内容
* @throws Exception
*/
public static void setObject(Object obj,String attribute,String valve) 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);
//setter方法,
Method setMethod = obj.getClass().getMethod(methodName, field.getType());
//设置属性
setMethod.invoke(obj, valve);
}
}
测试类
package reflect;
public class TestDemo {
public static void main(String[] args) throws Exception {
String value = "emp.ename:Jan|emp.job:Student";
EmpAction empAction = new EmpAction();
empAction.setValue(value);
System.out.println(empAction.getEmp());
}
}
//+++++++++++++++++++++++++++
Emp [ename=Jan, job=Student]
对于TestDemo来说,只需要调用EmpAction类即可,不需要担心有没有setter、getter,而EmpAction只需要将参数传入BeanOperation,它就像一套模板,不会一直去写getter、setter方法,而是通过这个模板进找到getter、setter,大大简化了代码。