Java实现:两实体类属性值合并

两实体类属性值合并方法,不需要另外导包,文中所用技术都比较浅显
需要注意:
1.父类属性值(继承来的属性)不会进行合并!!!
2.数据源实体类与数据目标实体类的属性名不相同的不会合并(大小写不区分)
调用方法:

    public static void main(String[] args) {
        User user = new User();
        user.setId(10086);
        user.setName("张三");
        user.setPassword("password");
        //可以先new新的对象再调用方法,值会赋到new出的对象中
        UserVO userVO = new UserVO();
        copy(user, userVO);
        //也可以直接接收实体
        UserVO userVO2 =  copy(user, new UserVO());
    }

代码:


import java.lang.reflect.Field;
import java.util.Collection;

/**
 * 类相关工具
 */
public class ClassUtils {
     

    /**
     * 实体数据合并: 将数据源与目标实体中,命名相同的属性值,合并至目标实体
     * 注:父类属性值不会合并
     * @param sourceBean 数据源实体
     * @param targetBean 目标实体
     * @return targetBean 数据的目标实体
     */
    public static <T> T copy(Object sourceBean, T targetBean) {
     
        if (sourceBean == null || targetBean == null) {
     
            return null;
        }
        Field[] sourceFields = sourceBean.getClass().getDeclaredFields();
        Field[] targetFields = targetBean.getClass().getDeclaredFields();
        for (Field sourceField : sourceFields) {
     
            for (Field targetField : targetFields) {
     
                if (judgeAssign(sourceField, targetField, sourceBean, targetBean)) {
     
                    break;
                }
            }
        }
        return targetBean;
    }

    /**
     * 判断并合并属性值
     * @param sourceField 数据源属性
     * @param targetField 目标源属性
     * @param sourceBean 数据源
     * @param targetBean 目标源
     * @return Boolean:是否合并
     */
    private static boolean judgeAssign(Field sourceField, Field targetField, Object sourceBean, Object targetBean) {
     
        try {
     
             if (sourceField.getName().equalsIgnoreCase(targetField.getName()) && sourceField.getType().getTypeName().equals(targetField.getType().getTypeName())) {
     
                sourceField.setAccessible(true);
                Object obj = sourceField.get(sourceBean);
                //集合类型非空判断
                if (obj instanceof Collection) {
     
                    Collection<?> newValue = (Collection<?>) obj;
                    if (newValue.size() <= 0)
                        return true;
                }
                //数据类型非空判断
                if (obj != null) {
     
                    targetField.setAccessible(true);
                    targetField.set(targetBean, obj);
                }
                return true;
            }
        } catch (IllegalAccessException e) {
     
            e.printStackTrace();
        }
        return false;
    }
}

你可能感兴趣的:(工具类,java)