java基于JDK反射复制不同对象相同属性值

该方法不需要引入任何外部jar包,仅基于JDK反射处理复制对象,性能良好,有问题可私信邮箱(1982580674@qq.com),有问题大家一起讨论学习,转载请写明出处©

注意:切记属性名要一致,属性get/set方法需一致方法名!!!

package com.alone.myproject.common.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>Description: [复制不同实体相同属性值]</p>
 * Created on 2019年08月20日
 * @author <a href="mailto: 1982580674@qq.com">恋雨烟梦</a>
 * @version 1.0
 * Copyright (c) 2019 恋雨烟梦©
 */
public abstract class BeanUtil {

    /**
     * Description: [复制单个对象]
     * @param objSource 源对象
     * @param clazz 目标class
     * @return: T 目标对象
     * Created on 2019年08月20日
     * @version 1.0
     * Copyright (c) 2019 恋雨烟梦©
     **/
    public static <T> T copyProperties(Object objSource, Class<T> clazz) {
        if (objSource == null)  return null;
        try {
            T objDes = clazz.newInstance();
            Field[] fields = objSource.getClass().getDeclaredFields();
            Field[] fieldsSup = objSource.getClass().getSuperclass().getDeclaredFields();
            Method[] method = clazz.getMethods();
            if (null != fields) {
                assignment(objSource, clazz, objDes, fields, method);
            }
            if (null != fieldsSup) {
                assignment(objSource, clazz, objDes, fieldsSup, method);
            }
            return objDes;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Description: [复制批量对象]
     * @param objSourceList 源对象-list装载
     * @param clazz 目标class
     * @return: List<T> 目标对象-list装载
     * Created on 2019年08月20日
     * @version 1.0
     * Copyright (c) 2019 恋雨烟梦©
     **/
    public static <T, E> List<T> copyList(List<E> objSourceList, Class<T> clazz) {
        if (null == objSourceList) return null;
        List<T> target = new ArrayList<T>();
        for (E souece : objSourceList) {
            target.add(copyProperties(souece, clazz));
        }
        return target;
    }

    /**
     * Description: [属性赋值]
     * @param objSource 源
     * @param clazz 目标class
     * @param objDes 目标
     * @param fields 属性
     * @param method 方法
     * @return: void
     * Created on 2019年08月20日
     * @version 1.0
     * Copyright (c) 2019 恋雨烟梦©
     **/
    private static <T> void assignment (Object objSource, Class clazz, T objDes, Field[] fields, Method[] method) {
        try {
            for (Field field : fields) {
                field.setAccessible(true);
                if (checkMethod(method, field.getName())) {
                    String setMethodName = "set" +  caseInitials(field.getName());
                    Method setMethod = clazz.getMethod(setMethodName, new Class[]{field.getType()});
                    setMethod.invoke(objDes, field.get(objSource));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Description: [校验目标是否有set方法-全名称匹配]
     * @param method 目标方法
     * @param attribute 属性名称
     * @return: boolean false-未包含有set方法
     * Created on 2019年08月20日
     * @version 1.0
     * Copyright (c) 2019 恋雨烟梦©
     **/
    private static boolean checkMethod(Method[] method, String attribute){
        if (null == method || null == attribute) return false;
        for (Method md : method) {
            String methodName = md.getName();
            String attributeMethod = "set" + caseInitials(attribute);
            if (methodName.equals(attributeMethod)) return true;
        }
        return false;
    }

    /**
     * Description: [首字母变大写]
     * @param attribute 目标字符串
     * @return: java.lang.String 处理字符串
     * Created on 2019年08月20日
     * @version 1.0
     * Copyright (c) 2019 恋雨烟梦©
     **/
    private static String caseInitials(String attribute){
        if (null == attribute) return null;
        char[] cs = attribute.toCharArray();
        cs[0] -= 32;
        return String.valueOf(cs);
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值