利用EZMorph复制bean
来源:互联网 发布:qq内部人员软件 编辑:程序博客网 时间:2024/05/24 06:35
利用EZMorph复制Bean
引子
众所周知,在java中对象之间的赋值是地址引用关系,如:
- A a = new A();
- 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. 先看几个简单类型的示例
- 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对象
- MorpherRegistry morperRegistry = new MorpherRegistry();
- MorphUtils.registerStandardMorphers(morperRegistry);
- Calendar dynaBean = Calendar.getInstance(); // initialized elsewhere
- System.out.println(dynaBean.getTime());
- morperRegistry.registerMorpher(new BeanMorpher(GregorianCalendar.class,morperRegistry));
- 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类
- 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;
- }
- public void hi(int age,String name){
- System.out.println("我是"+name+",今年"+age+"岁");
- }
- }
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中
- MorpherRegistry morperRegistry = new MorpherRegistry();
- udent 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());
输出结果为:
null
chb
可以看出Student和Teacher都有name属性,因此将属性值拷贝过来了,而Student没有id属性,因此Teacher对象的id属性值为空。
总结:对于Bean的copy功能还是不错的,特别是在多线程情况下的应用
- 利用EZMorph复制bean
- 利用EZMorph复制bean
- net.sf.ezmorph.bean.MorphDynaBean
- EZMorph
- net.sf.ezmorph.bean.MorphDynaBean cannotbe cast to xxx
- net.sf.ezmorph.bean.MorphDynaBean cannotbe cast to xxx
- net.sf.ezmorph.bean.MorphDynaBean cannot be cast to
- net.sf.ezmorph.bean.MorphDynaBean cannotbe cast to xxx
- JSON字符串转javabean-net.sf.ezmorph.bean.MorphDynaBean cannot be cast to java.util.Map
- java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to
- JSON字符串转javabean,报net.sf.ezmorph.bean.MorphDynaBean cannot be cast to.....
- ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to com.xxx.xxx
- JSON字符串转javabean,报net.sf.ezmorph.bean.MorphDynaBean cannot be cast to.....
- JSON字符串转javabean,报net.sf.ezmorph.bean.MorphDynaBean cannot be cast to.....
- 使用json-lib-2.4-jdk15转javabean,报net.sf.ezmorph.bean.MorphDynaBean转换异常
- JSON字符串转javabean,报net.sf.ezmorph.bean.MorphDynaBean cannot be cast to.....
- json错误解析net.sf.ezmorph.bean.MorphDynaBean cannot be cast to
- bean克隆复制
- SQL:exec sp_executesql 用法
- 飞思卡尔单片机DZ60---中央对齐PWM
- iOS开发中通过子视图获取父视图frame的方法
- onCreate()方法中的参数Bundle savedInstanceState 的意义用法
- SQL:exec sp_executesql 用法
- 利用EZMorph复制bean
- 学习HashMap遍历的两种方式
- 【rzxt】修改注册表相关键值让失去响应的程序自动关闭
- 某RAC数据库一个节点“宕机”原因分析
- Android 分享一个SharedPreferences的工具类,方便保存数据
- HDU 1088
- Java程序员应该知道的10个调试技巧
- Session详解
- CentOS6.4安装VirtualBox4.2