支持复杂bean,可以设置忽略的属性 方法代码 /** * javabean 属性复制 * * @param source * 源对象 * @param target * 目标对象 * @param forget * 忽略的属性名 */ public void beansPropertyCopy(Object source, Object target, List<String> forget) { forget.add("class"); forget.add("bytes"); forget.add("empty"); try { PropertyDescriptor[] sourceProp = PropertyUtils .getPropertyDescriptors(source); PropertyDescriptor[] targetProp = PropertyUtils .getPropertyDescriptors(target); for (PropertyDescriptor sp : sourceProp) { // System.out.println(sp.getName()); for (PropertyDescriptor tp : targetProp) { if (sp.getPropertyType().isAssignableFrom(Map.class)) { if (sp.getName().equals(tp.getName())) { Map sourceMap = (Map) PropertyUtils .getNestedProperty(source, sp.getName()); Map targetMap = new HashMap(); if (sourceMap == null) { break; } Set entrySet = sourceMap.entrySet(); for (Object o : entrySet) { Map.Entry e = (Map.Entry) o; Object sourceKey = e.getKey(); Object sourceValue = e.getValue(); Object targetKey = null; Object targetValue = null; if (sourceKey.getClass().isPrimitive()) { targetKey = sourceKey; } else { targetKey = sourceKey.getClass() .newInstance(); beansPropertyCopy(sourceKey, targetKey, forget); } if (sourceValue.getClass().isPrimitive()) { targetValue = sourceValue; } else { targetValue = sourceValue.getClass() .newInstance(); beansPropertyCopy(sourceValue, targetValue, forget); } targetMap.put(targetKey, targetValue); break; } } } if (sp.getPropertyType().isAssignableFrom(List.class)) { if (sp.getName().equals(tp.getName())) { if (PropertyUtils.getNestedProperty(source, sp .getName()) == null) { break; } Type t = source.getClass().getDeclaredField( tp.getName()).getGenericType(); if (t == null) continue; if (t instanceof ParameterizedType) // 如果是泛型参数的类型 { ParameterizedType pt = (ParameterizedType) t; Class genericClazz = (Class) pt .getActualTypeArguments()[0]; // 得到泛型里的class类型对象。 List targetList = new ArrayList(); List sourceList = (List) PropertyUtils .getNestedProperty(source, sp.getName()); for (Object sourceObject : sourceList) { Object targetObject = genericClazz .newInstance(); beansPropertyCopy(sourceObject, targetObject, forget); targetList.add(targetObject); } PropertyUtils.setNestedProperty(target, tp .getName(), targetList); break; } } } if (!forget.contains(tp.getName()) && sp.equals(tp) && tp.getReadMethod() != null) { Object value = PropertyUtils.getNestedProperty(source, sp.getName()); PropertyUtils.setNestedProperty(target, tp.getName(), value); break; } } } } catch (Exception e) { e.printStackTrace(); } }