使用 BeanCopier 复制对象

Cglib是一款比较底层的操作java字节码的框架。

BeanCopier是一个工具类,可以用于Bean对象内容的复制。

复制Bean对象内容的方法有很多,比如自己手动get set ,或者使用PropertyUtils或者使用BeanUtils

BeanCopier与 PropertyUtils 、BeanUtils的不同在于:

PropertyUtils 和 BeanUtils 使用的是反射机制来完成属性的复制。

而BeanCopier 的原理是通过字节码动态生成一个类,这个里面实现get 和 set方法。(性能和对象直接调用set一样)

BeanCopier 唯一的花销是生成动态类上,但是生成的后的象可以自己保存起来反复使用。

根据网上的资料 BeanCopier的性能是PropertyUtils (apache-common)的500倍。 PropertyUtils的性能是BeanUtils(apache-common)的2倍。

以下是使用例子

import net.sf.cglib.beans.BeanCopier;

public class BeanCopierTest {
	public static void main(String[] args) {
		Bean1 bean1 = new Bean1();
		Bean2 bean2 = new Bean2();
		bean1.setValue("hello");
		BeanCopier copier = BeanCopier.create(Bean1.class, Bean2.class, false);
		copier.copy(bean1, bean2, null);

		System.out.println(bean2.getValue());
	}

	static class Bean1 {
		private String value;
		public String getValue() {
			return value;
		}
		public void setValue(String value) {
			this.value = value;
		}
	}
	static class Bean2 {
		private String value;
		public String getValue() {
			return value;
		}
		public void setValue(String value) {
			this.value = value;
		}
	}
}

注意事项:BeanCopier在复制的时候使用get和set方法了。如果方法定义不严格,会造成复制的对象属性值不正确。

时间: 2024-12-20 22:43:32

使用 BeanCopier 复制对象的相关文章

条款12:复制对象时勿忘其每一个成分

对象复制操作operator=或copy构造函数,一定要记得复制对象每一个成份,特别是base class的成分: 注意:

js复制对象

<script type="text/javascript"> function getType(o){ var _t; return ((_t = typeof(o)) == "object" ? o==null && "null" || Object.prototype.toString.call(o).slice(8,-1):_t).toLowerCase();}function extend(destinati

javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法

javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法 前言 在js中,数组和对象的复制假设使用=号来进行复制.那仅仅是浅拷贝. 例如以下图演示: 如上.arr的改动,会影响arr2的值,这显然在绝大多数情况下,并非我们所须要的结果. 因此,数组以及对象的深拷贝就是javascript的一个基本功了. 数组的深拷贝 条条大道通罗马,实现数组的深拷贝.是有好几种方法的.举比例如以下: for 循环实现数组的深拷贝 for循环是很好用的.假设不知道高级方法.通过for循环可以完毕我们

白话windows内核对象共享之复制对象句柄

引子:话说老王的果园大丰收,老王心花怒放,带着全家去美国阿拉斯加度假.阿拉斯加有很多东西琳琅满目,都是中国没有的,老王及家人都过了一把购物瘾.但是有一次却遇到了比较尴尬的事.怎么回事呢?原来老王第一次出国,在买地摊上的东西时讨价还价100元,但是给人家的却是100元人民币,人家自然不干撒,你100元才多少美元呀,老王只好忍痛割爱给了600元人民币. 为什么会出现这样的尴尬呢?因为两个国家的货币换算不是一样的.中国的100元和美国的100元不是等价的,如何才能等价呢?必须根据当前汇率来换算.今天要

EC笔记:第二部分:12、复制对象时勿忘其每一个成分

EC笔记:第二部分:12.复制对象时勿忘其每一个成分 1.场景 某些时候,我们不想使用编译器提供的默认拷贝函数(包括拷贝构造函数和赋值运算符),考虑以下类定义: 代码1: class Point{ private: double x; double y; public:         Point()=default; Point(const Point &other){ x=other.x; y=other.y; } const Point& operator=(const Point

条款12:复制对象的时候不要忘了其每一个部分

首先要说的是当对一个已经定义了构造函数以及赋值运算符(拷贝)的class增加了成员的时候,一定要记得为这个class重新改写构造函数以及拷贝赋值运算符. 下一个容易遗忘的点在继承中,看下面的代码: 1 class Customer 2 { 3 public: 4 //... 5 Customer(const Customer & rhs):name(rhs){} 6 Customer & operator=(const Customer & rhs) 7 { 8 //... 9 }

复制对象 copy 与mutable copy

转载 :  http://blog.csdn.net/u010962810/article/details/18887841 通过copy方法可以创建可变对象或不可变对象的不可变副本,对于不可变副本,其对象的值不可以改变. 通过mutableCopy方法可以创建可变对象或不可变对象的可变副本,对于可变副本其对象是可变的. 复制分为浅复制和深复制两种:浅复制只是复制对象的引用,并没有复制对象的具体内容.深复制则创建了要复制对象的具体内容,并返回对象副本的引用. 对于复制Foundation中的对象

Effective C++_笔记_条款12_复制对象时勿忘其每一个成分

(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 编译器会在必要时候为我们的classes创建copying函数,这些“编译器生成版”的行为:将被烤对象的所有成员变量都做一份拷贝. 如果你声明自己的copying函数,意思就是告诉编译器你并不喜欢缺省实现中的某些行为.编译器仿佛被冒犯似的,会以一种奇怪的方式回敬:当你的实现代码几乎必然出错时却不告诉你.所以自己实现copying函数时,请遵循一条规则:如果你为c

Effective C++:条款12:复制对象时勿忘其每一个成分

(一) 一个继承体系的声明: class Date {...}; class Customer { public: ... private: string name; Date lastTransaction; }; class PriorityCustomer : public Customer { public: PriorityCustomer(const PriorityCustomer& rhs); PriorityCustomer& operator=(const Priori