前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >对象拷贝类cglib的使用实例

对象拷贝类cglib的使用实例

作者头像
用户5640963
发布2019-07-28 11:39:06
1.7K0
发布2019-07-28 11:39:06
举报
文章被收录于专栏:卯金刀GG卯金刀GG

目前流行的较为公用认可的工具类:

Apache的两个版本:(反射机制)

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

spring版本:(反射机制)

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

cglib版本:(使用动态代理,效率高)

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

在网上找了一个cglib的的对象copy,现记录以下,以备查找:

package cn.qazit.common.utils;

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

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包依赖

代码语言:javascript
复制
 <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>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档