对象的克隆,Dozer的使用

  现在有个复杂对象bean需要在赋值后在另一个地方用,想通过复制的方式拿到这个对象。首选是深度克隆,虽然发现该对象的父类已经实现了Cloneable接口,但父类是通过jar包引入的,而且在clone方法中对该bean一个map<String, Object>属性的处理有问题:获取到map的value时,直接强制转型为某一具体bean,而子类这个map在put时并非该具体bean的类型,因此克隆时报转型失败错误。考虑方案二,通过java序列化方式克隆,父类也已经实现了Serializable接口,但写对象和度对象方法都是空实现,本地重新实现后也报错了。使用json序列化倒是可以,就是性能不高。最后决定采用Dozer框架,Dozer底层也是apache的beanUtils方式复制bean,但更易用,可以直接用xml文件或者注解映射两个类,类可以是不同类型,字段也可以是不同类型、不同名称。

  使用前需要导入5个jar包:

commons-beanutils-1.9.3.jar

commons-lang3-3.5.jar

commons-logging-1.2.jar

dozer-5.4.0.jar

slf4j-api-1.7.25.jar

  这里通过注解来实现一个例子,具体使用参见下面代码:

package com.wulinfeng.dozer;

import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

public class CopyComponent {

    private String name;

    private int age;

    private Date date;

    private Map<String, String> internalMap;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Map<String, String> getInternalMap() {
        return internalMap;
    }

    public void setInternalMap(Map<String, String> internalMap) {
        this.internalMap = internalMap;
    }

    @Override
    public String toString() {
        StringBuilder names = new StringBuilder();
        if (null != internalMap && internalMap.entrySet() != null) {
            Iterator<Entry<String, String>> iter = internalMap.entrySet().iterator();
            while (iter.hasNext()) {
                Entry<String, String> c = iter.next();
                names.append("key: ");
                names.append(c.getKey());
                names.append("value: ");
                names.append(c.getValue());
            }
        }
        return "name: " + name + ", age: " + age + ", date: " + date + ", list : " + names.toString();
    }

}
package com.wulinfeng.dozer;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.dozer.DozerBeanMapper;
import org.dozer.Mapping;

public class Component {

    @Mapping("age")
    private String desc;

    @Mapping("name")
    private Integer price;

    private Date date;

    @Mapping("internalMap")
    private Map<String, String> externalAttrMap;

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Map<String, String> getExternalAttrMap() {
        return externalAttrMap;
    }

    public void setExternalAttrMap(Map<String, String> externalAttrMap) {
        this.externalAttrMap = externalAttrMap;
    }

    public static void main(String[] args) {
        Component component = new Component();

        // String -> int
        component.setDesc("9999");

        // int -> String
        component.setPrice(30);

        // date -> date
        component.setDate(new Date());

        // Map -> List
        Component componentpage = new Component();
        componentpage.setDesc("hello");
        Map<String, String> ext = new HashMap<String, String>();
        ext.put("name", "fengjiangtao");
        component.setExternalAttrMap(ext);

        DozerBeanMapper dozerBeanMapper = new DozerBeanMapper();
        CopyComponent copy = dozerBeanMapper.map(component, CopyComponent.class);
        System.out.println(copy);
    }

}

  运行结果:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
name: 30, age: 9999, date: Sun Apr 23 23:06:02 CST 2017, list : key: namevalue: fengjiangtao
时间: 2024-10-11 06:29:14

对象的克隆,Dozer的使用的相关文章

java——对象的克隆

对象的克隆 当拷贝一个变量时,原始变量与拷贝变量引用同一个对象,这就就是说,改变一个变量所引用的对象将会对另外一个变量产生影响.如下图: //拷贝 Employee original = new Employee("jim", 10000); Employee copy = orginal; //克隆 Employee copy = original.clone(); clone()方法是object类的一个proteced方法,也就是说,在用户编写的代码中不能直接调用它.只有Empl

java对象的克隆

java对象克隆方式主要有两种:浅克隆和深克隆 首先,不要把对象的克隆和对象的赋值搞混了,看下图 p2 = p1;就是赋值操作,赋值操作只是让被赋值对象指向之前对象的地址,实际上的物理内存是一块,而克隆操作的结果应该是两个对象分别指向内容相同的两块内存.如下就是克隆操作后的状态: 下面说浅克隆和深克隆: 深克隆和浅克隆的区别主要出现在类里有外部类对象时,如下,Person类中有Address类的对象 1 package cn.itcast.copy; 2 3 import java.io.Ser

关于对象的克隆Cloneable

突然看到了对象克隆这个东西, 又看了看它是Object类中的 native 方法, 感觉能提高程序的运行效率. 就来研究研究这个东西. part I.简单说一下对象的克隆 平时我们使用对象的时候, 只要拿到这个对象的引用, 引用者就可以随便修改对象中的属性(首先对象有对外的getter&setter方法), 有时候, 我们想让调用者获得该对象的拷贝(也就是一个内容完全相同的对象,但是在内存中存在两个这样的对象)? 有什么方法能解决这个呢? 1. 重新 new 一个对象, 然后给对象的每个属性重新

java学习---对象的克隆和序列化

1.假clone,虚拟机只是将对象的内存地址clone了一份,修改克隆后的对象内容,将影响原对象 public class Employee{ public Employee(){ } public Employee(String name, int age){ this.age = age; this.name = name; } @Override public String toString(){ return "姓名: " + name + "年龄: " +

43.对象深度克隆

1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title>对象深度克隆</title> 6 </head> 7 <body> 8 </body> 9 10 <script> 11 //对象深度克隆 12 function cloneObject(o

Java基础学习 —— 对象的克隆

对象的克隆分为对象的浅克隆和深克隆 一.对象的浅克隆 注意事项: 1.如果一个对象需要调用clone的方法克隆,那么该对象必须要实现Cloneable接口 2.Cloneable对象只是一个标识对象,并没有方法 1 public class demo1 { 2 public static void main(String[] args) throws Exception { 3 Person person = new Person("001","狗娃"); 4 Pe

【JAVA零基础入门系列】Day14 Java对象的克隆

今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢?什么时候需要使用呢?先来看一个小栗子: 简单起见,我们这里用的是Goods类的简单版本. public class Goods { private String title; private double price; public Goods(String aTitle, double aPri

Java 常用类库 之 对象的克隆 Cloneable

http://www.verejava.com/?id=16993097143799 /** 知识点: 对象的克隆 Cloneable */ public class TestClone { public static void main(String[] args) throws Exception { //实例化一只 喜洋洋 Sheep sheep=new Sheep("喜洋洋","白色"); //灰太狼 想克隆两只 喜洋洋 就可以大吃一顿 Sheep s1=(

零基础入门学习java第十四节:Java对象的克隆

今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢?什么时候需要使用呢?先来看一个小栗子: 简单起见,我们这里用的是Goods类的简单版本. public class Goods { private String title; private double price; public Goods(String aTitle, double aPri