利用EZMorph复制bean

利用EZMorph复制Bean

引子

众所周知,在java中对象之间的赋值是地址引用关系,如:

  1. Aa=newA();
  2. 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. 先看几个简单类型的示例

  1. inti=newIntMorpher().morph("123");
  2. Assert.assertEquals(123,i);//true!
  3. Stringstr=(String)StringMorpher.getInstance().morph(newInteger(123));
  4. Assert.assertEquals("123",str);//true!
  5. Boolean[]bools=(Boolean[])newObjectArrayMorpher(newBooleanObjectMorpher()).morph(newString[]{"true","false"});
  6. Assert.assertEquals(Boolean.TRUE,bools[0]);//true!
  7. Assert.assertEquals(Boolean.FALSE,bools[1]);//true!
  8. MorpherRegistrymorperRegistry=newMorpherRegistry();
  9. MorphUtils.registerStandardMorphers(morperRegistry);
  10. Integerx=(Integer)morperRegistry.morph(Integer.class,"2");
  11. Assert.assertEquals(newInteger(2),x);//true!

2. 再看一下java.util.Calendar对象

  1. CalendardynaBean=Calendar.getInstance();
  2. System.out.println(dynaBean.getTime());
  3. morperRegistry.registerMorpher(newBeanMorpher(GregorianCalendar.class,morperRegistry));
  4. CalendarmyBean=(Calendar)morperRegistry.morph(GregorianCalendar.class,dynaBean);
  5. myBean.add(Calendar.DATE,1);
  6. System.out.println(dynaBean.getTime());
  7. System.out.println(myBean.getTime());

注意:morperRegistry.registerMorpher(newBeanMorpher(GregorianCalendar.class,morperRegistry));

这里必须填写GregorianCalendar类型,如果用Calendar.class就会报出异常,因为EZMorph只能处理public类型的构造方法,而Calendar的构造方法是protected的。这种情况下,最好还是使用Calendar的clone功能。

3. 再看一下,不同对象之间的赋值

Student类

  1. publicclassStudent{
  2. privateintage;
  3. privateStringname;
  4. publicintgetAge(){
  5. returnage;
  6. }
  7. publicvoidsetAge(intage){
  8. this.age=age;
  9. }
  10. publicStringgetName(){
  11. returnname;
  12. }
  13. publicvoidsetName(Stringname){
  14. this.name=name;
  15. }
  16. }

Tearcher

  1. publicclassTeacher{
  2. privateStringid;
  3. privateStringname;
  4. publicStringgetId(){
  5. returnid;
  6. }
  7. publicvoidsetId(Stringid){
  8. this.id=id;
  9. }
  10. publicStringgetName(){
  11. returnname;
  12. }
  13. publicvoidsetName(Stringname){
  14. this.name=name;
  15. }
  16. }

将Student对象的name属性赋给Teacher对象的name中

  1. Studentstudent=newStudent();
  2. student.setName("chb");
  3. morperRegistry.registerMorpher(newBeanMorpher(Teacher.class,morperRegistry));
  4. Teacherteacher=(Teacher)morperRegistry.morph(Teacher.class,student);
  5. System.out.println(teacher.getId());
  6. System.out.println(teacher.getName());

总结:对于Bean的copy功能还是不错的,特别是在多线程情况下的应用

你可能感兴趣的:(多线程,.net,bean,json)