Java -- 利用反射实现对象之间相同属性复制BeanUtil
2016-12-05 13:53
766 查看
package com.redhorse.util; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; import java.util.List; import com.redhorse.consts.Const; import com.redhorse.entity.assets.base.CapitalDetailBeanBase; /** * 此工具类,用于老架构Bean 数据转换到 新架构(SOA)Bean <br> * 如com.redhorse.bean.CapitalDetailBean 转换为 * com.redhorse.base.entity.BaseEntity.CapitalDetailBeanBase <br> * * @author GaoPeng * */ public class BeanUtil { /** * 利用反射实现对象之间相同属性复制 * * @param source * 要复制的 * @param to * 复制给 */ public static void copyProperties(Object source, Object target) throws Exception { copyPropertiesExclude(source, target, null); } /** * 复制对象属性 * * @param from * @param to * @param excludsArray * 排除属性列表 * @throws Exception */ public static void copyPropertiesExclude(Object from, Object to, String[] excludsArray) throws Exception { List<String> excludesList = null; if (excludsArray != null && excludsArray.length > 0) { excludesList = Arrays.asList(excludsArray); // 构造列表对象 } Method[] fromMethods = from.getClass().getDeclaredMethods(); Method[] toMethods = to.getClass().getDeclaredMethods(); Method fromMethod = null, toMethod = null; String fromMethodName = null, toMethodName = null; for (int i = 0; i < fromMethods.length; i++) { fromMethod = fromMethods[i]; fromMethodName = fromMethod.getName(); if (!fromMethodName.contains("get")) continue; // 排除列表检测 if (excludesList != null && excludesList.contains(fromMethodName.substring(3).toLowerCase())) { continue; } toMethodName = "set" + fromMethodName.substring(3); toMethod = findMethodByName(toMethods, toMethodName); if (toMethod == null) continue; Object value = fromMethod.invoke(from, new Object[0]); if (value == null) continue; // 集合类判空处理 if (value instanceof Collection) { Collection<?> newValue = (Collection<?>) value; if (newValue.size() <= 0) continue; } toMethod.invoke(to, new Object[] { value }); } } /** * 对象属性值复制,仅复制指定名称的属性值 * * @param from * @param to * @param includsArray * @throws Exception */ public static void copyPropertiesInclude(Object from, Object to, String[] includsArray) throws Exception { List<String> includesList = null; if (includsArray != null && includsArray.length > 0) { includesList = Arrays.asList(includsArray); } else { return; } Method[] fromMethods = from.getClass().getDeclaredMethods(); Method[] toMethods = to.getClass().getDeclaredMethods(); Method fromMethod = null, toMethod = null; String fromMethodName = null, toMethodName = null; for (int i = 0; i < fromMethods.length; i++) { fromMethod = fromMethods[i]; fromMethodName = fromMethod.getName(); if (!fromMethodName.contains("get")) continue; // 排除列表检测 String str = fromMethodName.substring(3); if (!includesList.contains(str.substring(0, 1).toLowerCase() + str.substring(1))) { continue; } toMethodName = "set" + fromMethodName.substring(3); toMethod = findMethodByName(toMethods, toMethodName); if (toMethod == null) continue; Object value = fromMethod.invoke(from, new Object[0]); if (value == null) continue; // 集合类判空处理 if (value instanceof Collection) { Collection<?> newValue = (Collection<?>) value; if (newValue.size() <= 0) continue; } toMethod.invoke(to, new Object[] { value }); } } /** * 从方法数组中获取指定名称的方法 * * @param methods * @param name * @return */ public static Method findMethodByName(Method[] methods, String name) { for (int j = 0; j < methods.length; j++) { if (methods[j].getName().equals(name)) { return methods[j]; } } return null; } public static void main(String[] args) { com.redhorse.bean.CapitalDetailBean c = new com.redhorse.bean.CapitalDetailBean(); c.setAmount(Long.parseLong("1000")); c.setUserId(308850); c.setCapitaDirection(1); c.setType(Const.CAPITAL_DETAIL_TYPE_EXPECT_FEE_F); c.setCurrency(1); c.setFlag(1); c.setRemarks("junit test"); c.setId(1); CapitalDetailBeanBase c1 = new CapitalDetailBeanBase(); try { copyPropertiesExclude(c, c1, null); System.out.println(c1.toString()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
相关文章推荐
- Java利用反射实现对象之间相同属性复制
- C#利用反射实现两个类的对象之间相同属性的值的复制
- 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils
- 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils
- 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils
- C#利用反射实现两个类的对象之间相同属性的值的复制
- C#用反射实现两个类的对象之间相同属性的值的复制
- java利用反射完成不同类之间相同属性的复制
- C#用反射实现两个类的对象之间相同属性的值的复制
- 转 利用java反射实现两个具有相同属性bean赋值
- 利用java反射实现两个具有相同属性bean赋值
- java 反射实现不同对象相同属性值复制
- 利用java反射实现两个具有相同属性bean赋值
- 如何在SpringMVC框架中利用Java反射机制和Javassist实现Java对象、属性、注解的动态创建生成
- 利用Java反射实现普通对象到JSONObject的转换
- 利用Java反射机制和Javassist实现Java对象及其属性的动态创建生成
- C#利用反射来判断对象是否包含某个属性的实现方法
- 利用Apache的commons-beanutils和commons-collections包实现Java对象的按属性排序
- Java反射实现不同对象相同代码地对象查询和封装
- java利用反射技术遍历某个对象的属性及属性值