选择Cglib的BeanCopier进行Bean拷贝的理由是,其性能要比Spring的BeanUtils,Apache的BeanUtils和PropertyUtils要好很多,尤其是数据量比较大的情况下。
下面看具体例子:
package com.yusj.utils; import java.util.HashMap; import java.util.Map; import net.sf.cglib.beans.BeanCopier; /** * * 将beancopier做成静态类,方便拷贝 * <br>创建日期:2015年12月1日 * <br><b>Copyright 2015 UTOUU All Rights Reserved</b> * @author yushaojian * @since 1.0 * @version 1.0 */ public class CglibBeanCopierUtils { /** * */ public static Map<String, BeanCopier> beanCopierMap = new HashMap<String, BeanCopier>(); /** * @Title: copyProperties * @Description: TODO(bean属性转换) * @param source 资源类 * @param target 目标类 * @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 (!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依赖如下4个包:
<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>
相关推荐
NULL 博文链接:https://m635674608.iteye.com/blog/2270455
基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)...
对象复制工具,基于cglib BeanCopier 实现对实体对象、持久化对象、代理对象的克隆和复制, 避免重复克隆和复制,避免无限循环引用,(校验hashCode) 可指定实体对象和集合属性的克隆深度
使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能
Spring AOP实现方法之一:CGLIB 实现AOP功能
AOP-CGLIB学习-实现简单的注解权限系统
at net.sf.cglib.beans.BeanCopier$Generator.generateClass(BeanCopier.java:133) at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) at ...
JDK和CGlib分别实现的动态代理源代码
如果想使用CGLIB的技术来生成代理对象,那么需要引入CGLIB的开发的jar包,在Spring框架核心包中已经引入了CGLIB的开发包了。所以直接引入Spring核心开发包即可!
Cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展。如果想代理没有实现接口的类,就可以使用CGLIB实现。这是一个简单的案例。
Spring如何整合Hibernate和struts --cglib来实现事务管理.rtf.rtf
spring-bean 源码依赖的jar包,用于spring源码部署的时候使用
分别使用jdk和cglib实现动态代理,包含UML图。还有相关的博客链接:http://blog.csdn.net/y_love_f/article/details/46345581.博客中有具体的代理解释
cglib包及依赖汉cglib3.1和asm4.2,主要作用是...JDK的动态代理用起来非常简单,但它有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的继承的类,该怎么办?现在我们可以使用CGLIB包
使用CGLIB编写的Spring的拦截器 非常使用的哦
CGLIB简介CGLIB简介CGLIB简介CGLIB简介CGLIB简介
Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现.doc
cglib实现动态代理依赖jar包,包括asm-5.1.jar和cglib-3.2.4.jar
spring框架已经帮我们整合好了所有cglib要用到的jar包,所以下载这个jar包就可以了,然后使用cglib的代码和导入cglib包以及其依赖包是一模一样的(改一下导包就ok了)