复制对象属性:只复制需要的属性值,目标对象中原来的值不变(反射)
使用反射(性能很差,自测是cglib-beanmap性能的50分之1左右):
/** * 复制对象属性:只复制需要的属性值,目标对象中原来的值不变 * 只适用于2个相同对象 * @param from 要复制的对象 * @param to 目标对象 * @throws Exception */ @SuppressWarnings("unchecked") public static void copyPropertiesExclude(Object from, Object to) throws Exception { if(!from.getClass().equals(to.getClass())){ throw new RuntimeException("对象不是同一类型,fromClass:"+from.getClass()+",toClass:"+to.getClass()); } 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; } toMethodName = "set" + fromMethodName.substring(3); toMethod = findMethodByName(toMethods, toMethodName); //如果方法为null,不处理 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; }
逃避不一定躲得过,面对不一定最难过