您的位置:首页 > 其它

反射 复制一个实体对象并修改指定属性。

2014-05-19 16:59 274 查看
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
* 对象属性复制辅助类
*
* @author wangpeng 2014-1-3
*/
public class PropertiesCopier {

/**
* 属性复制,常用于实体的属性值修改<br>
* 将target(目标)中需要修改的属性的值替换为carreier(被修改属性携带者)的值<br>
* 需要被修改的属性为方法第4参数指定<br>
* 例:<br>
*
* <pre>
* User carrier = new User();
* carrier.setName("newvalue");
* User target = new User();
* target.setId(1);
* target.setName("oldvalue");
* PropertiesCopier.copy(User.class, carrier, target, new String[] { "name" });
* System.out.println(target.getName());
* </pre>
*
* 运行结果为target属性name值oldvalue被替换为newvalue<br>
*
* @param entityClass
*            对象属性复制所属类
* @param carrier
*            被修改属性携带者
* @param target
*            目标
* @param properties
*            需要被修改的属性
*/
public static void copy(Class<?> entityClass, Object carrier, Object target, String[] properties) {
// 对象属性复制所属类所有方法
Method[] entityMethods = entityClass.getMethods();
// 进行属性复制需要被调用的方法
Method[] invokeMethods = new Method[properties.length * 2];
// 从entityMethods(所有方法)中获取invokeMethods(需要被调用方法)
for (int i = 0; i < properties.length; i++) {
for (Method method : entityMethods) {
if (method.getName().equalsIgnoreCase("set" + properties[i]))
invokeMethods[i * 2] = method;
if (method.getName().equalsIgnoreCase("get" + properties[i]))
invokeMethods[i * 2 + 1] = method;
}
}
// 复制进行
for (int i = 0; i < invokeMethods.length; i += 2) {
try {
// target.setMethod(carrier.getMethod());
invokeMethods[i].invoke(target, invokeMethods[i + 1].invoke(carrier));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}


可以应用于web开发的数据持久化的修改操作

target从数据库取出来,carrier从前台传过来

target原属性值被carrier新属性值替换

然后执行更新

代码主要用到了反射机制 调用方式在方法注释中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐