——《墨子·修身》 今天使用org.springframework.cglib.beans.BeanCopier时遇到一个坑 这里记录一下 BeanCopier用于拷贝属性,详情可以看mofan的博客...private String name; private Integer age; } 我们测试一下 public static void main(String[] args) { BeanCopier...beanCopier = BeanCopier.create(Monkey.class, Cat.class, false); Monkey monkey = Monkey.builder()....name("ruben").age(12).build(); Cat cat = Cat.builder().build(); beanCopier.copy(monkey, cat,...{ private String name; private Integer age; } 我们再次运行 可以看到我们的Monkey对象里的值没有拷贝到Cat里去 所以这个坑就是 BeanCopier
下面通过拷贝bean对象来测试BeanCopier的特性: Java代码 public class OrderEntity { private int id; private...copier = BeanCopier.create(OrderEntity.class, OrderDto.class, false); OrderDto dto = new OrderDto...copier = BeanCopier.create(OrderEntity.class, PropWithDiffType.class, false); PropWithDiffType...copier = BeanCopier.create(OrderEntity.class, LackOfSetter.class, false); // 抛NullPointerException...BeanCopier只拷贝名称和类型都相同的属性。 2. 当目标类的setter数目比getter少时,创建BeanCopier会失败而导致拷贝不成功。
BeanCopier 实现属性拷贝的主要代码: BeanCopier beanCopier = BeanCopier.create(dad.getClass(), dadly.getClass(),...false); beanCopier.copy(dad, dadly, null); 查看BeanCopier源码可知: abstract public class BeanCopier {...由此我们可以根据此行代码: BeanCopier beanCopier = BeanCopier.create(dad.getClass(), dadly.getClass(), false); 并且...(), useConverter); return (BeanCopier)super.create(key); } ... } 由此可知:...所以beanCopier 实际上是BeanCopier的代理类,该代理类实现了 copy()方法,即如何复制相同名称的属性。
概述 常见或常用的几种Bean属性复制工具 Apache.BeanUtils Apache.PropertyUtil Spring.BeanUtils Cglib.BeanCopier MapStruct...---- Cglib BeanCopier net.sf.cglib.beans 使用动态代理,生成字节码类,再通过Java反射成Class,调用其copy方法。...执行过程 创建BeanCopier [使用了缓存,该过程也消耗资源,建议全局只初始化一次] 通过字节码生成了两个类 KeyFactory BeanCopier 调用copy...(支持自定义类型转换器) 【有convert的情况】 【无convert的情况】 生成的BeanCopier里面直接使用Bean的setter/getter ---- MapStruct...- 总结 根据不同工具的性能及功能维度,个人建议当对象转换操作较少或者应用对性能要求较高时,尽量不采用工具,而是手写getter/setter;在不考虑性能的情况下,普通的对象转换可以使用Cglib.BeanCopier
BeanCopier从名字可以看出了,是一个快捷的bean类复制工具类。...copier = BeanCopier.create(one.class, two.class, false); two two = new two(); copier.copy...copier = BeanCopier.create(one.class, oneDif.class, false); oneDif oneDif = new oneDif();...copier = BeanCopier.create(one.class, oneNoSetter.class, false); oneNoSetter oneNoSetter = new...实例放到缓存中,下次可以直接获取,提升性能 static final Map BEAN_COPIERS = new HashMap<String, BeanCopier
一、spring的beanutils、hutool的beanutil、cglib的beancopier比较 1、性能:cglib > spring > hutool 2、性能差距:本机4c16g macbookpro...5s 2、无法实现null字段跳过 三、解决方案(代码见最后) 首先我先说明我的方案参考了网上所有能找到的帖子,包括百度、谷歌,最终参考掘金的以为老哥的(虽然他代码有bug,但是整体思路是参考他的)扩展BeanCopier...实现只复制非null值 – 掘金 1、每次使用都需要create,这个很简单,搞个map缓存起来即可,但是你们去网上搜大部分代码都是复制粘贴的,都是key拼接source名字+target名字,v为beancopier...2、无法实现null字段跳过,其实beancopier提供了converter函数式接口给我们拓展,但是他坑就坑在没有目标对象字段,所以无法判断目标字段是否为null,所以只能重写一个converter...,重写了converter,beancopier也得跟着重写。
对象之间的转换; 深度复制; 1,BeanMap 实现的是Map接口;将对象转换成Map非常简单; 2,BeanCopier 深度复制; Demo主要类: Test: /** * Created...System.out.println(beanMap.get("age")+","+beanMap.get("name")); Persion persion = new Persion(); BeanCopier...beanCopier = BeanCopier.create(User.class,Persion.class,false); beanCopier.copy(user,persion
BeanCopier的简单使用 cglib包下的一个类. 简单栗子 // 创建实例....BeanCopier copier = BeanCopier.create(source.getClass(), target.getClass(), false); // Copy操作 copier.copy...(person1, person2, null); 注意到: 第三个参数userConverter,是否开启Convert,默认BeanCopier只会做同名,同类型属性的copier,否则就会报错....); Person2 p2 = new Person2(); // 给p1赋值 p1.setName("鲁智深"); p1.setBirthday(new Date(834012360000L)); BeanCopier...copier = BeanCopier.create(Person1.class, Person2.class, true); // 根据需求编写的DateConverter类, 需要实现Converter
大概90%的时候,它们的结构都是类似的,但是我们很不喜欢写很多冗长的b.setF1(a.getF1())这样的代码,于是我们需要BeanCopier来帮助我们。...下面介绍Cglib的BeanCopier的使用。...总结: BeanCopier只拷贝名称和类型都相同的属性。 当目标类的setter数目比getter少时,创建BeanCopier会失败而导致拷贝不成功。...三、缓存BeanCopier提升性能 BeanCopier拷贝速度快,性能瓶颈出现在创建BeanCopier实例的过程中。...final Map BEAN_COPIERS = new HashMap(); public static void
CollectionUtils; import org.apache.commons.collections4.map.ReferenceMap; import org.springframework.cglib.beans.BeanCopier...; /** * @date 21/06/2020 22:19 */ public class BeanCopierUtils { private static Map<String, BeanCopier
BeanCopier 使用 BeanCopier在cglib包里,它的使用也比较简单: @Test public void beanCopierSimpleTest() { SourceVO...在上面的性能测试中,BeanCopier是所有中表现最好的,那么我们分析一下它的实现原理。...由于是直接生成字节码执行,所以BeanCopier的性能接近手写 get/set。...BeanCopier.create方法 public static BeanCopier create(Class source, Class target, boolean useConverter)...性能确实很高,但从源码可以看出BeanCopier只会拷贝名称和类型都相同的属性,而且如果一旦使用Converter,BeanCopier只使用Converter定义的规则去拷贝属性,所以在convert
; import org.springframework.cglib.beans.BeanCopier; /** * BeanCopier工具类 * * @author zwy */ public class...** * 初始化 BeanCopier * * @param source * @param target * @return */ private static BeanCopier initCopier...(Class source, Class target) { BeanCopier beanCopier = BeanCopier.create(source, target, false); beanCopierMap.put...(source.getName() + "_" + target.getName(), beanCopier); return beanCopier; } /** * 获取BeanCopier * *...()); if (beanCopier !
比较的是四种复制的方式,分别为Apache的BeanUtils和PropertyUtils,Spring的BeanUtils,Cglib的BeanCopier。...toBean; } }; IMethodCallBack cglibCB = new IMethodCallBack() { BeanCopier...bc = BeanCopier.create(FromBean.class, ToBean.class, false); @Override...public String getMethodName() { return "BeanCopier.create";...从整体的表现来看,Cglib的BeanCopier的性能是最好的无论是数量较大的1万次的测试,还是数量较少10次,几乎都是趋近与零损耗,Spring是在次数增多的情况下,性能较好,在数据较少的时候,性能比
beanCopier; public DetachableDirtyEntityAdapter(Object content, BeanCopier beanCopier) { Preconditions.checkNotNull...this.beanCopier = beanCopier; this.beanCopier.copy(content, this.content, null); this.beanMap...beanCopier; public NonDetachableDirtyEntityAdapter(Object content, BeanCopier beanCopier) {...newEmptyContentInstance(); this.beanCopier = beanCopier; this.beanCopier.copy(content, this.content...针对原本类中属性的复制和存储,我这儿用的是spring提供的BeanCopier,如果你有什么更高效的工具,欢迎在下方留言。
Java 开发手册 这里介绍的是使用 Cglib BeanCopier。...beanCopier = BeanCopier.create(source.getClass(), target.getClass(), false); beanCopier.copy...将 BeanCopier 作为一个元,在各个线程使用的时候,共享。...beanCopier; if (!...CACHE.containsKey(cacheKey)) { // 进入到这里会创建一个BeanCopier实例并且放在缓存map中 beanCopier
> beanCopierMap = new HashMap(); public static void copyProperties(Object source...beanCopierMap.containsKey(beanKey)) { copier = BeanCopier.create(source.getClass(), target.getClass(...初始化例子: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
com.example.test.utils; import net.sf.cglib.beans.BeanMap; import org.springframework.cglib.beans.BeanCopier...>, BeanCopier>> cache = new ConcurrentHashMap(); public static T copy(Object source, Class...beanCopier = getCacheBeanCopier(source.getClass(), target.getClass()); beanCopier.copy(source...beanCopier = getCacheBeanCopier(source.getClass(), target); beanCopier.copy(source, newInstance...(16)); return copierConcurrentHashMap.computeIfAbsent(target, aClass -> BeanCopier.create(
存入 被copy的类型 和 copy的类型 BeanCopier beanCopier = BeanCopier.create(User.class, UserDemo.class, false); User...beanCopier = null; if(!...copierMap.containsKey(key)){ //当不存在的时候就创建新的 beanCopier = BeanCopier.create(source.getClass(), target.getClass...(), false); //把新创建的对象存入map copierMap.put(key,beanCopier); } } } beanCopier = copierMap.get(key); //获取到对象以后就进行...copy beanCopier.copy(source,target,null); } } 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。
(此处有反射),而且有一定时间上的消耗,但BeanCopier.copy并未使用反射。...beanCopier = BeanCopier.create(CaiNiao.class, CainiaoDTO.class, false); CaiNiao caiNiao = new CaiNiao...源码 public abstract class BeanCopier { //缓存key private static final BeanCopier.BeanCopierKey KEY_FACTORY...= (BeanCopier.BeanCopierKey)KeyFactory.create(BeanCopier.BeanCopierKey.class); //copy方法 private static...(), this.useConverter); return (BeanCopier)super.create(key); } //生成BeanCopier的实现类 public void generateClass
BeanCopier是Cglib包中的一个类,用于对象的复制。...implements SysUserService { @Autowired private SysUserMapper sysUserMapper; public final static BeanCopier...SysUser_BO2DO = BeanCopier.create(SysUserBO.class, SysUserDO.class, false); /**...② 第二种 引入Converter,可以对某些特定属性值进行特殊操作 创建一个类,在main方法里面测试 public class Demo02 { public final static BeanCopier...SysUser_BO2DO = BeanCopier.create(SysUserBO.class, SysUserDO.class, true); public static
领取专属 10元无门槛券
手把手带您无忧上云