對象拷貝類cglib的使用實例

目前流行的較爲公用承認的工具類:java

Apache的兩個版本:(反射機制)node

org.apache.commons.beanutils.PropertyUtils.copyProperties(Object dest, Object orig) org.apache.commons.beanutils.BeanUtils.copyProperties(Object dest, Object orig)spring

spring版本:(反射機制)apache

org.springframework.beans.BeanUtils.copyProperties(Object source, Object target, Class editable, String[] ignoreProperties)工具

cglib版本:(使用動態代理,效率高).net

net.sf.cglib.beans.BeanCopier.copy(Object paramObject1, Object paramObject2, Converter paramConverter)代理

在網上找了一個cglib的的對象copy,現記錄如下,以備查找:code

package cn.qazit.common.utils;對象

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

import net.sf.cglib.beans.BeanCopier;

/** *

  • @ClassName:CglibBeanCopierUtils.java

  • @Title:CglibBeanCopierUtils.java

  • @Description:

  • @CopyRight:CopyRight(c)2016

  • @Company:www.qazit.cn

  • @author ly

  • @date 2016年10月13日 下午5:55:01

  • @version:v1.0 */ public class CglibBeanCopierUtils {

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

    public static void copyProperties(Object source,Object target){
    String beanKey = generateKey(source.getClass(),target.getClass());
    BeanCopier copier = null;
    if (!beanCopierMap.containsKey(beanKey)) {
    copier = BeanCopier.create(source.getClass(), target.getClass(), false);
    beanCopierMap.put(beanKey, copier);
    }else {
    copier = beanCopierMap.get(beanKey);
    }
    copier.copy(source, target, null);
    }
    private static String generateKey(Class<?>class1,Class<?>class2){
    return class1.toString() + class2.toString();
    }
    /注: (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則忽略掉該字段的操做,這樣就能夠避免異常的發生。
    /
    }

MAVEN包依賴

<dependency>  
        <groupId>asm</groupId>  
        <artifactId>asm</artifactId>  
        <version>3.3.1</version>  
    </dependency>  
    <dependency>  
        <groupId>asm</groupId>  
        <artifactId>asm-commons</artifactId>  
        <version>3.3.1</version>  
    </dependency>  
    <dependency>  
        <groupId>asm</groupId>  
        <artifactId>asm-util</artifactId>  
        <version>3.3.1</version>  
    </dependency>  
    <dependency>  
        <groupId>cglib</groupId>  
        <artifactId>cglib-nodep</artifactId>  
        <version>2.2.2</version>  
    </dependency>
相關文章
相關標籤/搜索