實體類引數複製

四道街硬漢發表於2018-08-16

實體類引數複製:用於接收的VO,複製到實體Bean裡面,要求引數名相同,不同的引數名手動get   set新增

package com.bofeng.smart.school.common.bean;

import org.springframework.cglib.beans.BeanCopier;

import java.util.HashMap;
import java.util.Map;

/**
 * 將beancopier做成靜態類,方便拷貝
 * <br>建立日期:2015年12月1日
 * <br><b>Copyright 2015 UTOUU All Rights Reserved</b>
 *
 * @author yushaojian
 * @version 1.0
 * @since 1.0
 */
public class BeanUtils {

    public static final Map<String, BeanCopier> BEAN_COPIERS = new HashMap<String, BeanCopier>();

    /**
     * @param source 資源類
     * @param target 目標類
     * @Title: copyProperties
     * @Description:
     *     (1)相同屬性名,且型別不匹配時候的處理,ok,但是未滿足的屬性不拷貝;
     *     (2)get和set方法不匹配的處理,建立拷貝的時候報錯,無法拷貝任何屬性(當且僅當sourceClass的get方法超過set方法時出現)
     *     (3)BeanCopier
     *     初始化例子:BeanCopier copier = BeanCopier.create(Source.class, Target.class, useConverter=true)
     *     第三個引數userConverter,是否開啟Convert,預設BeanCopier只會做同名,同型別屬性的copier,否則就會報錯.
     *     copier = BeanCopier.create(source.getClass(), target.getClass(), false);
     *     copier.copy(source, target, null);
     *     (4)修復beanCopier對set方法強限制的約束
     *     改寫net.sf.cglib.beans.BeanCopier.Generator.generateClass(ClassVisitor)方法
     *     將133行的
     *     MethodInfo write = ReflectUtils.getMethodInfo(setter.getWriteMethod());
     *     預先存一個names2放入
     *      109        Map names2 = new HashMap();
     *      110        for (int i = 0; i < getters.length; ++i) {
     *      111          names2.put(setters[i].getName(), getters[i]);
     *                 }
     *     呼叫這行程式碼前判斷查詢下,如果沒有改writeMethod則忽略掉該欄位的操作,這樣就可以避免異常的發生。
     * @author yushaojian
     * @date 2015年11月25日下午4:56:44
     */
    public static void copyProperties(Object source, Object target) {
        String beanKey = generateKey(source.getClass(), target.getClass());
        BeanCopier copier = null;
        if (!BEAN_COPIERS.containsKey(beanKey)) {
            copier = BeanCopier.create(source.getClass(), target.getClass(), false);
            BEAN_COPIERS.put(beanKey, copier);
        } else {
            copier = BEAN_COPIERS.get(beanKey);
        }
        copier.copy(source, target, null);
    }

    private static String generateKey(Class<?> class1, Class<?> class2) {
        return class1.toString() + class2.toString();
    }

}  

測試用例::

BeanUtils.copyProperties(a,q);
        q.setA(a.getA());
        q.setB(a.getB());

a是有資料的類,q是需要被複制進去資料的類(沒資料)

 

相關文章