| EZMorph是一個簡單的java類庫用于將一種對象轉(zhuǎn)換成另外一種對象。EZMorph原先是Json-lib項目中的轉(zhuǎn)換器。EZMorph 支持原始數(shù)據(jù)類型(Primitive),對象(Object),多維護數(shù)組轉(zhuǎn)換與DynaBeans的轉(zhuǎn)換。兼容JDK1.3.1,整個類庫大小只有 76K左右。 官方網(wǎng)站:http://ezmorph.sourceforge.net/ 眾所周知,在java中對象之間的賦值是地址引用關(guān)系,如: A a = new A(); A b = a; 則修改b的屬性,a的屬性也會跟著修改。 ?????? 在很多場合下,我們希望克隆出一個新的對象出來,新對象的修改不會影響原有對象,這時我們一般常用的有如下兩種方式: 使對象實現(xiàn)Cloneable接口,這個只適用于我們自己的java對象 使用jakatar commons的BeanUtils實現(xiàn)bean copy ???? 昨晚看到一個新的組件:EZMorph,可以實現(xiàn)同樣的功能,這里簡單介紹一下。 ????? EZMorph據(jù)說起源于json,后來獨立出來了,有興趣的可以到官網(wǎng)(http://ezmorph.sourceforge.net/)上瀏覽一下。 EZMorph的主要原理 ??? 若要將A的屬性賦給B,則經(jīng)過如下步驟: new一個B的實例 遍歷A的屬性 若A有某個屬性P1,B也有一個屬性P1,則將A的P1的屬性值賦給B的P1 代碼示例 1. 先看幾個簡單類型的示例 ??????? int i = new IntMorpher().morph("123"); ??????? Assert.assertEquals(123, i); // true! ??????? String str = (String) StringMorpher.getInstance().morph(new Integer(123)); ??????? Assert.assertEquals("123", str); // true! ??????? Boolean[] bools = (Boolean[]) new ObjectArrayMorpher(new BooleanObjectMorpher()).morph(new String[] { "true", "false" }); ??????? Assert.assertEquals(Boolean.TRUE, bools[0]); // true! ??????? Assert.assertEquals(Boolean.FALSE, bools[1]); // true! ???????? ??????? MorpherRegistry morperRegistry = new MorpherRegistry();??? ??????? MorphUtils.registerStandardMorphers(morperRegistry);??? ??????? Integer x = (Integer) morperRegistry.morph( Integer.class, "2" );??? ??????? Assert.assertEquals( new Integer(2), x); //true! 2. 再看一下java.util.Calendar對象 ??????? Calendar dynaBean = Calendar.getInstance(); ??????? System.out.println(dynaBean.getTime()); ??????? morperRegistry.registerMorpher( new BeanMorpher( GregorianCalendar.class, morperRegistry ) );??? ??????? Calendar myBean = (Calendar) morperRegistry.morph( GregorianCalendar.class, dynaBean ); ???????? ??????? myBean.add(Calendar.DATE, 1); ??????? System.out.println(dynaBean.getTime()); ??????? System.out.println(myBean.getTime()); 注意: morperRegistry.registerMorpher( new BeanMorpher( GregorianCalendar.class, morperRegistry ) );?? 這里必須填寫GregorianCalendar類型,如果用Calendar.class就會報出異常,因為EZMorph只能處理public 類型的構(gòu)造方法,而Calendar的構(gòu)造方法是protected的。這種情況下,最好還是使用Calendar的clone功能。 3. 再看一下,不同對象之間的賦值 Student類 public class Student { ??? private int age; ??? private String name; ??? public int getAge() { ??????? return age; ??? } ??? public void setAge(int age) { ??????? this.age = age; ??? } ??? public String getName() { ??????? return name; ??? } ??? public void setName(String name) { ??????? this.name = name; ??? } ???? } Tearcher public class Teacher { ??? private String id; ??? private String name; ??? public String getId() { ??????? return id; ??? } ??? public void setId(String id) { ??????? this.id = id; ??? } ??? public String getName() { ??????? return name; ??? } ??? public void setName(String name) { ??????? this.name = name; ??? } } 將Student對象的name屬性賦給Teacher對象的name中 ??????? Student student = new Student(); ??????? student.setName("chb"); ??????? morperRegistry.registerMorpher( new BeanMorpher(Teacher.class, morperRegistry ) );??? ??????? Teacher teacher = (Teacher) morperRegistry.morph( Teacher.class, student ); ??????? System.out.println(teacher.getId()); ??????? System.out.println(teacher.getName()); 總結(jié):對于Bean的copy功能還是不錯的,特別是在多線程情況下的應(yīng)用 |