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新属性值替换
然后执行更新
代码主要用到了反射机制 调用方式在方法注释中