beans (相关操作类)--- BeanCopier

本文介绍了Java中的BeanCopier与BeanUtils的性能差异,BeanCopier通常表现出比BeanUtils更高的性能,尤其是在关闭Converter功能时。文章通过示例展示了如何初始化和使用BeanCopier,包括如何自定义Converter进行类型转换。同时强调了BeanCopier创建对象的注意事项,建议通过静态变量缓存实例以提高效率,并给出了适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 许多网友都做过BeanCopier,BeanUtils的测试,基本BeanCopier的性能是BeanUtils的10倍以上。,出了反射这一性能差异外,BeanUtils默认是开启Converter功能,允许同名,不同类型的属性进行拷贝,比如Date对象到String属性。
  • 有兴趣的同学可以去比较下PropertyUtils,默认不开启Converter功能,发现性能是BeanUtils的2倍多。

初始化例子:BeanCopier copier = BeanCopier.create(Source.class, Target.class, true); 
第三个参数useConverter,是否开启Convert,默认BeanCopier只会做同名,同类型属性的copier,否则就会报错。

Converter使用例子代码

  1. public class BeanCopierTest {  
  2.   
  3.     public static void main(String args[]) {  
  4.         System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "/tmp/1");  
  5.         BeanCopier copier = BeanCopier.create(Source.class, Target.class, true);  
  6.         Source from = new Source();  
  7.         from.setValue(1);  
  8.   
  9.         Target to = new Target();  
  10.         Converter converter = new BigIntConverter();  
  11.         copier.copy(from, to, converter); //使用converter类  
  12.   
  13.         System.out.println(to.getValue());  
  14.     }  
  15. }  
  16.   
  17. class BigIntConverter implements net.sf.cglib.core.Converter {  
  18.   
  19.     @Override  
  20.     public Object convert(Object value, Class target, Object context) {  
  21.         System.out.println(value.getClass() + " " + value); // from类中的value对象  
  22.         System.out.println(target); // to类中的定义的参数对象  
  23.         System.out.println(context.getClass() + " " + context); // String对象,具体的方法名  
  24.         if (target.isAssignableFrom(BigInteger.class)) {  
  25.             return new BigInteger(value.toString());  
  26.         } else {  
  27.             return value;  
  28.         }  
  29.     }  
  30.   
  31. }  
  32. ----  
  33. 反编译后看的代码:  
  34. public class Target$$BeanCopierByCGLIB$$e1c34377 extends BeanCopier  
  35. {  
  36.     public void copy(Object obj, Object obj1, Converter converter)  
  37.     {  
  38.         Target target = (Target)obj1;  
  39.         Source source = (Source)obj;  
  40.         // 注意是直接调用,没有通过reflect  
  41.         target.setValue((BigInteger)converter.convert(new Integer(source.getValue()), CGLIB$load_class$java$2Emath$2EBigInteger, "setValue"));   
  42.     }  
  43. }  

使用注意

  1. 避免每次进行BeanCopier.create创建对象,一般建议是通过static BeanCopier copier = BeanCopier.create()
  2. 合理使用converter。
  3. 应用场景:两个对象之间同名同属性的数据拷贝, 不能单独针对其中的几个属性单独拷贝
示例:BeanCopier copy = BeanCopier.create(NmRequireSheet.class, NmRequireSheetHis.class, false);
      copy.copy(n, his, null);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值