文档章节

对象拷贝类cglib的使用实例

卯金刀GG
 卯金刀GG
发布于 2016/10/13 18:04
字数 469
阅读 100
收藏 0

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

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

 <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>

本文转载自:

卯金刀GG
粉丝 26
博文 265
码字总数 72868
作品 0
昌平
程序员
私信 提问
深入理解Cglib动态代理及手动实现

CGLIB介绍与原理(部分节选自网络) 一、什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代...

HOT_POT
2018/07/28
103
0
为什么通过spring的cglib代理类无法取到被代理对象的public成员属性?

service层: controller层: 在控制器MyController的test方法中,获取不到myService.str的值。 由于MyService类使用了@Transactional开启了事务,所以spring默认会通过cglib创建了一个代理子...

陈祖煌
01/22
461
4
spring基础知识---AOP动态代理原理

Spring Boot实践——Spring AOP实现之动态代理 Spring AOP 介绍   AOP的介绍可以查看 Spring Boot实践——AOP实现   与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理...

spinachgit
02/21
188
0
说说 Spring AOP 的底层实现技术(JDK 与 CGLib 动态代理)

Spring AOP 使用了两种代理机制: 基于 JDK 的动态代理(接口代理)。 基于 CGLib 的动态代理(类代理)。 1 订单服务实例 假设有这样的一个订单服务,它提供新增订单的方法,我们需要对这个...

deniro
2018/06/01
0
0
Cglib 与 JDK动态代理

AOP 代理的两种实现: jdk是代理接口,私有方法必然不会存在在接口里,所以就不会被拦截到; cglib是子类,private的方法照样不会出现在子类里,也不能被拦截。 JDK 动态代理。 具体有如下四...

xiaolyuh
09/20
48
0

没有更多内容

加载失败,请刷新页面

加载更多

无回路有向图的拓扑排序

因公司业务需要,在表单中每个字段都会配置自动计算,但自动计算公式中会引用到其他字段中的值。所以希望可以根据计算公式,优先计算引用的公式。所以最终使用了无回路有向图的扩扑排序来实现...

兜兜毛毛
40分钟前
3
0
如何抢占云栖大会C位?史上最强强强攻略来了

点击观看视频: APSARA云栖大会开发者情怀 原文链接 本文为云栖社区原创内容,未经允许不得转载。

阿里云官方博客
53分钟前
5
0
Kubernetes 从懵圈到熟练:集群服务的三个要点和一种实现

作者 | 声东 阿里云售后技术专家<br /> 文章来源:Docker,点击查看原文。 <br />以我的经验来讲,理解 Kubernetes 集群服务的概念,是比较不容易的一件事情。尤其是当我们基于似是而非的理解...

阿里巴巴云原生
56分钟前
7
0
PHP7.3的新特性

2018年12月6日,PHP7.3正式版发布,在PHP7.2基础上进行了大量错误修复和安全优化,性能提升10%! 从目前的更新说明来看,PHP 7.3 并不是一个主打新特性的版本,包含更多的是 bug 修复。PHP 7...

迅睿CMS-PHP开源CMS程序
今天
7
0
Tomcat 应用中并行流带来的类加载问题

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/f-X3n9cvDyU5f5NYH6mhxQ 作者:肖铭轩、王道环 随着 Java8 的不断流行,越来越多的开发人员使用并行流(parallel)...

vivo互联网技术
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部