利用EZMorph复制bean

来源:互联网 发布:qq内部人员软件 编辑:程序博客网 时间:2024/05/24 06:35

利用EZMorph复制Bean

 

引子

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

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

[java] view plaincopyprint?
  1. int i = new IntMorpher().morph("123");  
  2. Assert.assertEquals(123, i); // true!  
  3. String str = (String) StringMorpher.getInstance().morph(new Integer(123));  
  4. Assert.assertEquals("123", str); // true!  
  5. Boolean[] bools = (Boolean[]) new ObjectArrayMorpher(new BooleanObjectMorpher()).morph(new String[] { "true","false" });  
  6. Assert.assertEquals(Boolean.TRUE, bools[0]); // true!  
  7. Assert.assertEquals(Boolean.FALSE, bools[1]); // true!  
  8. MorpherRegistry morperRegistry = new MorpherRegistry();  
  9. MorphUtils.registerStandardMorphers(morperRegistry);  
  10. Integer x = (Integer) morperRegistry.morph(Integer.class"2");  
  11. Assert.assertEquals(new Integer(2), x); // true!  
 


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

[java] view plaincopyprint?
  1. MorpherRegistry morperRegistry = new MorpherRegistry();  
  2. MorphUtils.registerStandardMorphers(morperRegistry);  
  3. Calendar dynaBean = Calendar.getInstance(); // initialized elsewhere  
  4. System.out.println(dynaBean.getTime());  
  5. morperRegistry.registerMorpher(new BeanMorpher(GregorianCalendar.class,morperRegistry));  
  6. Calendar myBean = (Calendar) morperRegistry.morph(GregorianCalendar.class, dynaBean);  
 

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

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

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

Student类

[java] view plaincopyprint?
  1. public class Student {  
  2.     private int age;  
  3.     private String name;  
  4.     public int getAge() {  
  5.         return age;  
  6.     }  
  7.     public void setAge(int age) {  
  8.         this.age = age;  
  9.     }  
  10.     public String getName() {  
  11.         return name;  
  12.     }  
  13.     public void setName(String name) {  
  14.         this.name = name;  
  15.     }  
  16.       
  17.     public void hi(int age,String name){  
  18.         System.out.println("我是"+name+",今年"+age+"岁");  
  19.     }  
  20. }  
 

Tearcher

[java] view plaincopyprint?
  1. public class Teacher {  
  2.     private String id;  
  3.     private String name;  
  4.     public String getId() {  
  5.         return id;  
  6.     }  
  7.     public void setId(String id) {  
  8.         this.id = id;  
  9.     }  
  10.     public String getName() {  
  11.         return name;  
  12.     }  
  13.     public void setName(String name) {  
  14.         this.name = name;  
  15.     }  
  16. }  
 

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

[java] view plaincopyprint?
  1. MorpherRegistry morperRegistry = new MorpherRegistry();       
  2. udent student = new Student();  
  3. student.setName("chb");  
  4. morperRegistry.registerMorpher(new BeanMorpher(Teacher.class,morperRegistry));  
  5. Teacher teacher = (Teacher) morperRegistry.morph(Teacher.class, student);  
  6. System.out.println(teacher.getId());  
  7. System.out.println(teacher.getName());  
 

输出结果为:

 

null

chb

 

 

可以看出Student和Teacher都有name属性,因此将属性值拷贝过来了,而Student没有id属性,因此Teacher对象的id属性值为空。

 

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

原创粉丝点击