一、前言

基于java.lang.reflect.*反射机制定义对象转换工具类,实现POJO持久化实体和DTO传值对象间相互转换 - 单对象通过源对象及目标class类进行pojoDtoConvertor相互转换(POJODTO)、集合对象转换通过源对象序列及目标class类进行pojoDtoCollectionConvertor相互转换(List List)、源对象和目标对象pojoDtoConvertor相互转换(POJODTO)。

二、代码示例import java.lang.reflect.Field;@b@import java.lang.reflect.InvocationTargetException;@b@import java.lang.reflect.Method;@b@import java.math.BigDecimal;@b@import java.util.ArrayList;@b@import java.util.Date;@b@import java.util.List; @b@import org.apache.log4j.Logger; @b@import com.xwood.common.util.date.DateUtils;@b@@b@/**@b@ * 类描述: 近似类(e.g. POJO vs DTO ) 存在多个同名属性,本类为从源对象生成目标对象提供便利@b@ * 注:目前只对同名属性进行赋值,非同名属性忽略,请自行对应@b@ * 

当源对象或目标对象未找到属性时,会获取直接父类的属性

 @b@ */@b@public abstract class ObjectConvertorUtils {@b@@b@protected static final Logger log = Logger.getLogger(ObjectConvertorUtils.class);@b@@b@/**@b@ * 单对象转换(e.g.POJODTO)@b@ * 

需要有get/set方法 @b@ * @param @b@ * @param source 源对象@b@ * @param dest 目标类@b@ * @param idForce 是否强制同步非同类型的同名属性(只支持基本数据类型)@b@ * @return 目标类的一个实例@b@ */@b@public static  T pojoDtoConvertor(Object source, Class dest, boolean isForce) {@b@if(source == null){@b@return null;@b@}@b@@b@try {@b@T dto = dest.newInstance();@b@Field[] fields = dest.getDeclaredFields();@b@@b@Field[] totalFields = null;@b@@b@//直接父类@b@Class> superClass = dest.getSuperclass();@b@if(superClass != null){@b@Field[] superFields =superClass.getDeclaredFields();@b@totalFields = new Field[fields.length + superFields.length];@b@@b@for(int j = 0; j  0) {@b@for (Field field : totalFields) {@b@String fieldName = field.getName();@b@String getMethodName = "get"@b@+ fieldName.substring(0, 1).toUpperCase()@b@+ fieldName.substring(1);@b@String setMethodName = "set"@b@+ fieldName.substring(0, 1).toUpperCase()@b@+ fieldName.substring(1);@b@@b@Method getMethod;@b@try {@b@getMethod = source.getClass().getMethod(getMethodName,@b@new Class[] {});@b@} catch (NoSuchMethodException e) {@b@log.warn(" class: " + source.getClass() + " do not have Method: " + getMethodName);@b@continue;@b@}@b@@b@Method setMethod;@b@try {@b@setMethod = dest.getMethod(setMethodName,@b@new Class[] { field.getType() });@b@} catch (NoSuchMethodException e) {@b@log.warn(" class: " + dest + " do not have Method: " + setMethodName);@b@continue;@b@}@b@Object obj = getMethod.invoke(source);@b@@b@if(obj != null){@b@try {@b@Field sourceField = source.getClass().getDeclaredField(field.getName());@b@if(field.getType().isAssignableFrom(sourceField.getType()))@b@setMethod.invoke(dto, new Object[] { obj });@b@else if(isForce){@b@//两边类型都是简单类型及其封装类或String类型时才做强制转换@b@if ((ClassUtils.isPrimitiveOrWrapper(field.getType())@b@|| field.getType().getSimpleName().equals(@b@"String")@b@|| field.getType().getSimpleName().equals(@b@"BigDecimal"))@b@&&@b@((ClassUtils.isPrimitiveOrWrapper(sourceField.getType())@b@|| sourceField.getType().getSimpleName().equals(@b@"String")@b@|| field.getType().getSimpleName().equals(@b@"BigDecimal")))){@b@field.setAccessible(true);@b@setValue(dto, field, obj);@b@}@b@}@b@}  catch (NoSuchFieldException e) {@b@log.warn("classs: " + source.getClass() + " do not have field: " + field.getName());@b@try {@b@Class> sc = source.getClass().getSuperclass();@b@if(sc != null){@b@Field sourceField = sc.getDeclaredField(field.getName());@b@if(field.getType().isAssignableFrom(sourceField.getType()))@b@setMethod.invoke(dto, new Object[] { obj });@b@else if(isForce){@b@//两边类型都是简单类型及其封装类或String类型时才做强制转换@b@if ((ClassUtils.isPrimitiveOrWrapper(field.getType())@b@|| field.getType().getSimpleName().equals(@b@"String")@b@|| field.getType().getSimpleName().equals(@b@"BigDecimal"))@b@&&@b@((ClassUtils.isPrimitiveOrWrapper(sourceField.getType())@b@|| sourceField.getType().getSimpleName().equals(@b@"String")@b@|| field.getType().getSimpleName().equals(@b@"BigDecimal")))){@b@field.setAccessible(true);@b@setValue(dto, field, obj);@b@}@b@}@b@}else{@b@continue;@b@}@b@} catch (NoSuchFieldException e1) {@b@log.warn("super classs: " + source.getClass().getSuperclass() + " do not have field: " + field.getName());@b@continue;@b@}@b@}@b@}@b@}@b@}@b@@b@return dto;@b@@b@} catch (InstantiationException e) {@b@log.error(e.toString());@b@} catch (SecurityException e) {@b@log.error(e.toString());@b@} catch (InvocationTargetException e) {@b@log.error(e.toString());@b@} catch (IllegalAccessException e) {@b@log.error(e.toString());@b@} catch (IllegalArgumentException e) {@b@log.error(e.toString());@b@}@b@@b@return null;@b@}@b@@b@private static void setValue(Object obj, Field field, Object value) throws IllegalAccessException{@b@if(value == null){@b@return;@b@}@b@try{@b@field.set(obj, value);@b@}catch(IllegalArgumentException e){@b@field.set(obj, getRealValue(field.getType(),value));@b@}@b@}@b@@b@private static Object getRealValue(Class> type, Object value){@b@if(int.class.isAssignableFrom(type)){@b@return new Integer(value.toString());@b@}else if(long.class.isAssignableFrom(type)){@b@return new Long(value.toString());@b@}else if(boolean.class.isAssignableFrom(type)){@b@return new Boolean(value.toString());@b@}else if(double.class.isAssignableFrom(type)){@b@return new Double(value.toString());@b@}else if(char.class.isAssignableFrom(type)){@b@return (Character) value.toString().charAt(0);@b@}else if(short.class.isAssignableFrom(type)){@b@return new Short(value.toString());@b@}else if(float.class.isAssignableFrom(type)){@b@return new Float(value.toString());@b@}else if(byte.class.isAssignableFrom(type)){@b@return new Byte(value.toString());@b@}else if(BigDecimal.class.isAssignableFrom(type)){@b@return new BigDecimal(value.toString());@b@}@b@if(Date.class.isAssignableFrom(type)){@b@return DateUtils.string2Date(value.toString());@b@}@b@return null;@b@}@b@@b@/**@b@ * 集合对象转换(e.g.List  List)@b@ * 

需要有get/set方法