使用SSH框架的过程中,经常涉及到修改,我们只要对部门的部门属性进行修改我们通常的做法是先从数据库把对象查询出来target,
再把从页面上传递来的修改过的值封装成为一个对象model,我们需要把model中修改过的属性重新赋值给target,再对target进行保存.完成修改.
在这个target.setXxx(model.getXxx)过程中有可能有大量的苦力工作要做,所以我利用反射做了一个简单的封装,只需要传递两个对象,就可以完成重新赋值的过程.
package cn.service.impl;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @Description:
* 通过两个对象的传入,进行两个对象的赋值,
* 共2个参数,把第一个对象中的参数传递给第二个对象
* @author: 长河
* @version: 0.0.2beta
* @Company:
* @date: 2017年3月26日
*/
public class Demo {
//model是从前台接受的数据,封装的对象
//target是从后台根据id查询到的数据,封装的对象
public static void setValue(T model,T target) throws Exception {
//获得实体类
Class clazz = model.getClass();
//查看有那些字段
Field[] fields = clazz.getDeclaredFields();
//遍历
for (Field field : fields) {
//属性的名字
String fieldName = field.getName();
//属性的类型
//Class type = field.getType();
//再得到getter方法的名字
String getMethodName = "get" + (fieldName.charAt(0)+"").toUpperCase() + fieldName.substring(1);
Method getMethod = clazz.getMethod(getMethodName);
//判断model的哪个属性是否为空,利用get方法
Object object = getMethod.invoke(model);
if(object!=null) {
//不为空就进行赋值
// 通过属性名,来获取对应的setXXX的名字
String setMethodName = "set" + (fieldName.charAt(0)+"").toUpperCase() + fieldName.substring(1);
//这是set方法
Method setMethod = clazz.getMethod(setMethodName, field.getType());
//这里需要进行类型的强制转换吗?
setMethod.invoke(target, object);
}
}
}
}
其实我觉得应该是field.getType,得到参数的类型,根据类型控制对象中值的赋予,而不是简单的使用Object进行赋值.不过经过简单的测试,这个类可以使用,没什么大问题.
这是个简单的封装还有其他的需要的条件可以考虑,可以把这个类封装的更好
https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-18045781879.2.33c5236bZlPDUM&id=569353717228
深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理) 很不错的虚拟机视频教程.