在java应用开发过程中不可避免的会使用到对象copy属性赋值。

1、常用的beancopy工具

组织(包)
工具类
基本原理
其他
apache PropertyUtils java反射  
  BeanUtils java反射  
Spring BeanUtils java反射  
cglib BeanCopier 动态代理 初始化代理类

2、用法举例

  • sourceBean

    public class SourceBean{
     
        public SourceBean(int id,Sting name,String title){
            this.id=id;
        tihs.name=name;
        this.title=title;
    }
        private int id;
        private string name;
        private String tilte;
     
    }
  • dstBean

    public class DstBean{
        private int id;
     
        private string name;
     
        private String tilte;
     
        private String selfFiled;
     
    }
  • 使用方式
public class testBeanCopy{
    DstBean target = new DstBean();
    SourceBean source = new SourceBean(123,"好好学习","天天向上");
    public void testApache(){
        try {
            long start1 = System.currentTimeMillis();
            org.apache.commons.beanutils.PropertyUtils.copyProperties(target, source );
            System.out.println("apache properyUtils--"+ (System.currentTimeMillis()-start1)+"ms");
            System.out.println("target "+target);
 
            start1 = System.currentTimeMillis();
            org.apache.commons.beanutils.BeanUtils.copyProperties(target, source);
            System.out.println("apache beanutil--"+ (System.currentTimeMillis()-start1)+"ms");
            System.out.println("target "+target);
        catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public void testSpring(){
        try {
            long start = System.currentTimeMillis();
            BeanUtils.copyProperties(source, target);
            System.out.println("spring--"+(System.currentTimeMillis()-start)+"ms");
            System.out.println("target "+target);
        catch (Exception e) {
            e.printStackTrace();
        }
    }
//------cglib----
private BeanCopier beanCopier = BeanCopier.create(SourceBean.class, DstBean.classfalse);
    public void testCgLib(){
        try {
            long start = System.currentTimeMillis();
            beanCopier.copy(source, target, null);
            System.out.println("cglib--"+(System.currentTimeMillis()-start)+"ms");
            System.out.println("target "+target);
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}  

输出结果,

cglib--0ms
cglib -- target DstBean [id=123, name=好好学习, title=天天向上]
spring--4ms
target DstBean [id=123, name=好好学习, title=天天向上]

apache properyUtils--46ms
target DstBean [id=123, name=好好学习, title=天天向上]
apache beanutil--1ms
target DstBean [id=123, name=好好学习, title=天天向上]

有兴趣的同学可以测试100次、1000次。10000次的结论

特别注意:cglib使用不要每次都创建beancopier,否性能会下降

    1.  
      测试性能,执行10000次

      apache properyUtils–432ms

      spring–309ms
      apache beanutil--232ms
      cglib--3ms
      java copy--2ms

      建议:

      1.如果字段少,使用get/set最快 ---java copy

      2.字段多,调用不频繁,使用apache beanutil,最省事,静态方法拿来即用

      3.字段多,调用频繁,使用cglib,需要创建BeanCopier

java开发中beancopy比较的更多相关文章

  1. paip.java 开发中web server的选择jboss resin tomcat比较..

    paip.java 开发中web server的选择jboss resin tomcat比较.. 作者Attilax  艾龙, EMAIL:1466519819@qq.com 来源:attilax的专 ...

  2. Java开发中常见的危险信号(中)

    本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...

  3. Java开发中文件读取方式总结

    JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径. 路径分为绝对路径和相对路径. 在文件系统中,绝对路径都是以盘符开始的,例如C:\abc\1.txt. 什么是相对路径呢?相对路 ...

  4. java开发中遇到的问题及解决方法(持续更新)

    摘自 http://blog.csdn.net/pony12/article/details/38456261 java开发中遇到的问题及解决方法(持续更新) 工作中,以C/C++开发为主,难免与其他 ...

  5. Java开发中常见的危险信号(上)

    本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...

  6. 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)

    编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...

  7. 完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络]

    完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络] 地址:http://blog.csdn.net/qq_35101189/article/details/53729720?ref=m ...

  8. Java 开发中的对象拷贝

    前言 在 Java 开发中,很多时候需要将两个属性基本相同的对象进行属性复制,比如 DO 转 VO等等. 本文主要介绍自己实现的简易拷贝工具类与 Spring 提供的属性拷贝的对比. Spring 提 ...

  9. [ 转载 ] Java开发中的23种设计模式详解(转)

    Java开发中的23种设计模式详解(转)   设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...

随机推荐

  1. 2017 计蒜之道 初赛 第三场 D. 腾讯狼人杀 (点边都带权的最大密度子图)

    点边都带权的最大密度子图,且会有必须选的点. 求\(\frac{\sum w_e}{k*(2n-k)}\)的最大值,其中k为子图点数 设\[h(g) = \sum w_e - g*(2nk-k^2)\ ...

  2. Java最佳实战

    1. 针对日志记录的优化:logback , 预编译形式记录日志,开发debug,生产info,访问日志和错误日志分开,异常日志输出到单独文件 2. 针对数据库连接的优化 :单例模式或数据库连接池 3 ...

  3. NIO 02 (转)

    本文转自:http://weixiaolu.iteye.com/blog/1479656 SelectionKey.OP_ACCEPT // 服务端监听,并注册OP_ACCEPT事件后,就已准备好接受 ...

  4. Nginx将不同IP的请求分发到不同的WEB服务器

    server { listen ; server_name localhost; large_client_header_buffers 16k; client_max_body_size 300m; ...

  5. 如何在Kubernetes集群动态使用 NAS 持久卷

    1. 介绍: 本文介绍的动态生成NAS存储卷的方案:在一个已有文件系统上,自动生成一个目录,这个目录定义为目标存储卷: 镜像地址:registry.cn-hangzhou.aliyuncs.com/a ...

  6. javascript 判断数据类型的几种方法

    javascript 判断数据类型的几种方法一.typeof 直接返回数据类型字段,但是无法判断数组.null.对象 typeof 1 "number" typeof NaN &q ...

  7. 《Java程序设计》实验2实验报告

    20145318 <Java程序设计>实验2 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 ...

  8. 20145321 《Java程序设计》第5周学习总结

    20145321 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 1.Try.catch:Java中所有错误都会被打包为对象,通过try和catch语法可以对代表错误的对象做 ...

  9. Spring MVC工作流程图

    图一   图二    Spring工作流程描述       1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获:       2. Disp ...

  10. Base64编码原理

    Base64编码之所以称为Base64,是因为其使用64个字符来对任意数据进行编码,同理有Base32.Base16编码.标准Base64编码使用的64个字符为: 这64个字符是各种字符编码(比如AS ...