java对象拷贝——PropertyUtils.copyProperties()用法和性能

BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。

使用PropertyUtils.copyProperties()拷贝一个bean中的属性到另一个bean中,第一个参数是目标bean,第二个参数是源bean。

 

例一

Book srcBook = new Book();
srcBook.setName("Java");
Book destBook = new Book();
PropertyUtils.copyProperties(destBook, srcBook);
System.out.println(destBook.getName());

 

 

例二(对删除的数据进行备份)

Student s = new Student();

s.setName("xy")

................

StudentBak sbak = new StudentBak();

PropertyUtils.copyProperties(sbak , s);

StudentBakDao.save(sbak);

StudentDao.delete(s);

 

没有PropertyUtils.copyProperties,我们只能

StudentBak sbak = new StudentBak();

sbak.setName(s.getName);

.........................

如果有是十个属性,我们不是累呆了。

该方法做对象的拷贝很方便,但是它的性能问题相当差

 

看下面的测试代码:
public class A

{
private String name;
public String getName()

{
return name;
}
public void setName(String name)

{
this.name = name;
}
}

import org.apache.commons.beanutils.PropertyUtils;
public class PropertyUtilsTest

{
public static void main(String []args)
{

 

普通的copy,每个字段拷贝

A a1 = new A();
a1.setName("wang");

A a2 = new A();
long b = new java.util.Date().getTime();
a2.setName(a1.getName());

long e = new java.util.Date().getTime();
System.out.println("time1="+(e-b));

 

try

{

PropertyUtils.copyProperties方法copy

A a3 = new A();
b = new java.util.Date().getTime();
PropertyUtils.copyProperties(a3, a1);
e = new java.util.Date().getTime();
System.out.println("time2="+(e-b));

}

 

catch (Exception e1)

{
e1.printStackTrace();
}
}
}

最后输出:

time1=0
time2=265

 

两种方法时间差那么多!

 

 

原帖地址:http://hi.baidu.com/dobodo/blog/item/f741897be7a0a1f80bd187ef.html

时间: 2024-12-30 03:52:18

java对象拷贝——PropertyUtils.copyProperties()用法和性能的相关文章

java对象拷贝

java赋值是复制对象引用,如果我们想要得到一个对象的副本,使用赋值操作是无法达到目的的: @Test public void testassign(){ Person p1=new Person(); p1.setAge(31); p1.setName("Peter"); Person p2=p1; System.out.println(p1==p2);//true } 如果创建一个对象的新的副本,也就是说他们的初始状态完全一样,但以后可以改变各自的状态,而互不影响,就需要用到jav

java对象序列化学习笔记

java对象|笔记 目前网络上关于对象序列化的文章不少,但是我发现详细叙述用法和原理的文章太少.本人把自己经过经验总结和实际运用中的体会写成的学习笔记贡献给大家.希望能为整个java社区的繁荣做一点事情.    序列化的过程就是对象写入字节流和从字节流中读取对象.将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机.对象序列化功能非常简单.强大,在RMI.Socket.JMS.EJB都有应用.对象序列化问题在网

如何精确地测量java对象的大小-底层instrument API

关于java对象的大小测量,网上有很多例子,大多数是申请一个对象后开始做GC,后对比前后的大小,不过这样,虽然说这样测量对象的大小是可行的,不过未必是完全准确的,因为过程中包含对象本身的开销,也许你运气好,正好能碰上,差不多,不过这种测试往往显得十分的笨重,因为要写一堆代码才能测试一点点东西,而且只能在本地测试玩玩,要真正测试实际的系统的对象大小这样可就不行了,本文说说java一些比较偏底层的知识,如何测量对象大小,java其实也是有提供方法的.注意:本文的内容仅仅针对于Hotspot VM,如

如何精确地测量java对象的大小

[本文转载于如何精确地测量java对象的大小] 关于java对象的大小测量,网上有很多例子,大多数是申请一个对象后开始做GC,后对比前后的大小,不过这样,虽然说这样测量对象的大小是可行的,不过未必是完全准确的,因为过程中包含对象本身的开销,也许你运气好,正好能碰上,差不多,不过这种测试往往显得十分的笨重,因为要写一堆代码才能测试一点点东西,而且只能在本地测试玩玩,要真正测试实际的系统的对象大小这样可就不行了,本文说说java一些比较偏底层的知识,如何测量对象大小,java其实也是有提供方法的.注

Java对象及元素的存储区域

在JAVA平台上开发应用程序的时候,有一个很大的特点就是其是在应用程序运行的时候才建立对象. 换句话说,在程序运行的时候,才会最终确定对象的归属,即对象应该存储在什么地方.由于存储在不同 的区域,其在性能上会有所不同.为此作为Java程序开发人员需要了解各个存储区域的特点以及对性能的 影响.然后再根据需要来调整应用程序的区域分配.总的来说,在操作系统中有五个地方可以用来保存应 用程序运行中的数据.这类区域的特点以及对性能的影响分析如下. 存储区域一:寄存器 虽然同在内存中,但是不同的区域由于用途

传递和使用Java对象

在前例中,我们将一个字串传递给固有方法.事实上,亦可将自己创建的Java对象传递给固有方法. 在我们的固有方法内部,可访问已收到的那些对象的字段及方法. 为传递对象,声明固有方法时要采用原始的Java语法.如下例所示,MyJavaClass有一个public(公共)字段,以及一个public方法.UseObjects类声明了一个固有方法,用于接收MyJavaClass类的一个对象.为调查固有方法是否能控制自己的自变量,我们设置了自变量的public字段,调用固有方法,然后打印出public字段的

Java对象序列化使用基础

所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象.这个过程也可以通过网络实现,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新"装配".像RMI.Socket.JMS.EJB它们中的一种,彼此为什么能够传递Java对象,当然都是对象序列化机制的功劳. Java对象序列化机制一般来讲有两种用途: Java的JavaBeans: Bean的状态信息通常是在设计时配置的,Bean的状态信息必须被

Java对象池技术的原理及其实现

摘要 本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术时所应注意的问题. 关键词 对象池:对象池技术:Java 对象:性能 Java对象的生命周期分析 Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除.因此,对象的生命周期长度可用如下的表达式表示:T = T1 + T2 +T3.其中T1表示对象的创建时间,T2表示对象的使用时间,而T3则表示其清除时间.由此,我们可以看出,只有T2是真正有效的时间,而T1.T3则是对象本身的开

再谈Finalizer对象--大型App中内存与性能的隐性杀手

    在上一篇<提升Android下内存的使用意识和排查能力>的文章中,多次提到了Finalizer对象.也可以看到该对象的清理至少是需要两次GC才能完成,而在Android5.0,尤其是6.0以后的系统中,对于该对象的回收变得更加的慢.我们在开发的时候往往关注内存的分配.泄漏,却容易忽视Finalizer对象,其实在大型App中,该对象是引起内存和性能问题的一个不可忽视的元凶.在类似于双十一会场的界面中,在使用一段时间后,设备会变得越来越慢,内存使用量也不断攀升,甚至容易引发OOM,这个有