利用EZMorph复制Bean
引子
众所周知,在java中对象之间的赋值是地址引用关系,如:
- Aa=newA();
- Ab=a;
则修改b的属性,a的属性也会跟着修改。
在很多场合下,我们希望克隆出一个新的对象出来,新对象的修改不会影响原有对象,这时我们一般常用的有如下两种方式:
-
使对象实现Cloneable接口,这个只适用于我们自己的java对象
-
使用jakatar commons的BeanUtils实现bean copy
昨晚看到一个新的组件:EZMorph,可以实现同样的功能,这里简单介绍一下。
EZMorph据说起源于json,后来独立出来了,有兴趣的可以到官网(http://ezmorph.sourceforge.net/)上浏览一下。
EZMorph的主要原理
若要将A的属性赋给B,则经过如下步骤:
-
new一个B的实例
-
遍历A的属性
-
若A有某个属性P1,B也有一个属性P1,则将A的P1的属性值赋给B的P1
代码示例
1. 先看几个简单类型的示例
- inti=newIntMorpher().morph("123");
- Assert.assertEquals(123,i);//true!
- Stringstr=(String)StringMorpher.getInstance().morph(newInteger(123));
- Assert.assertEquals("123",str);//true!
- Boolean[]bools=(Boolean[])newObjectArrayMorpher(newBooleanObjectMorpher()).morph(newString[]{"true","false"});
- Assert.assertEquals(Boolean.TRUE,bools[0]);//true!
- Assert.assertEquals(Boolean.FALSE,bools[1]);//true!
- MorpherRegistrymorperRegistry=newMorpherRegistry();
- MorphUtils.registerStandardMorphers(morperRegistry);
- Integerx=(Integer)morperRegistry.morph(Integer.class,"2");
- Assert.assertEquals(newInteger(2),x);//true!
2. 再看一下java.util.Calendar对象
- CalendardynaBean=Calendar.getInstance();
- System.out.println(dynaBean.getTime());
- morperRegistry.registerMorpher(newBeanMorpher(GregorianCalendar.class,morperRegistry));
- CalendarmyBean=(Calendar)morperRegistry.morph(GregorianCalendar.class,dynaBean);
- myBean.add(Calendar.DATE,1);
- System.out.println(dynaBean.getTime());
- System.out.println(myBean.getTime());
注意:morperRegistry.registerMorpher(newBeanMorpher(GregorianCalendar.class,morperRegistry));
这里必须填写GregorianCalendar类型,如果用Calendar.class就会报出异常,因为EZMorph只能处理public类型的构造方法,而Calendar的构造方法是protected的。这种情况下,最好还是使用Calendar的clone功能。
3. 再看一下,不同对象之间的赋值
Student类
- publicclassStudent{
- privateintage;
- privateStringname;
- publicintgetAge(){
- returnage;
- }
- publicvoidsetAge(intage){
- this.age=age;
- }
- publicStringgetName(){
- returnname;
- }
- publicvoidsetName(Stringname){
- this.name=name;
- }
- }
Tearcher
- publicclassTeacher{
- privateStringid;
- privateStringname;
- publicStringgetId(){
- returnid;
- }
- publicvoidsetId(Stringid){
- this.id=id;
- }
- publicStringgetName(){
- returnname;
- }
- publicvoidsetName(Stringname){
- this.name=name;
- }
- }
将Student对象的name属性赋给Teacher对象的name中
- Studentstudent=newStudent();
- student.setName("chb");
- morperRegistry.registerMorpher(newBeanMorpher(Teacher.class,morperRegistry));
- Teacherteacher=(Teacher)morperRegistry.morph(Teacher.class,student);
- System.out.println(teacher.getId());
- System.out.println(teacher.getName());
总结:对于Bean的copy功能还是不错的,特别是在多线程情况下的应用
本文介绍EZMorph组件在Java中的使用方法,包括基本原理、代码示例及多线程场景下的应用。通过EZMorph可以轻松实现不同对象间的属性复制。
183

被折叠的 条评论
为什么被折叠?



