现在有个复杂对象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

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

  1. java对象 深度克隆(不实现Cloneable接口)和浅度克隆

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt128 为什么需要克隆: 在实际编程过程中,我们常常要遇到这种情况:有一个对象 ...

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

    对象的克隆分为对象的浅克隆和深克隆 一.对象的浅克隆 注意事项: 1.如果一个对象需要调用clone的方法克隆,那么该对象必须要实现Cloneable接口 2.Cloneable对象只是一个标识对象, ...

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

    今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢 ...

  4. Java对象的克隆和深浅问题

    Java实现克隆的方式 Java实现克隆的方式有如下两种, 推荐采用实现Cloneable接口的方式 实现Cloneable接口, 重写clone方法, 调用父类的clone方法 还有另一种方法, 不 ...

  5. java基础知识总结--对象的克隆

    前提:在Java语言中所有的类的都是缺省的继承Java语言中的Object类的, protected native Object clone() throws CloneNotSupportedExc ...

  6. Java基础--对象的克隆

    文章转载自https://www.cnblogs.com/Qian123/p/5710533.html 阅读目录 为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 假如说你想复制一 ...

  7. Java对象的克隆

    今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢 ...

  8. net对象的克隆

    class Person { public string name; public List<string> hobby; } void main() { Person p1 = new ...

  9. 设计模式系列之原型模式(Prototype Pattern)——对象的克隆

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  10. JAVA笔记10__Math类、Random类、Arrays类/日期操作类/对象比较器/对象的克隆/二叉树

    /** * Math类.Random类.Arrays类:具体查JAVA手册...... */ public class Main { public static void main(String[] ...

随机推荐

  1. vi使用技巧(转载)

    http://www.cnblogs.com/xusir/p/3245007.html 这是转载的链接

  2. jvm-知识点总结

    参考: https://blog.csdn.net/wuqinghai2012/article/details/51485414 http://pengjiaheng.iteye.com/blog/5 ...

  3. 关于MySQL的TinyInt数据类型在Delphi中作为Boolean类型的一个要注意的问题

    关于MySQL的TinyInt数据类型在Delphi中作为Boolean类型的一个要注意的问题: 在定义TinyInt类型字段时,若要作为Delphi中作为Boolean类型,则该字段的长度必须为1!

  4. Windows安装Ubuntu桌面操作系统到移动硬盘中以及错误解决

    用到的工具:U盘一个(usb3.0,你懂的),移动硬盘(我这个是笔记本里面取出来的机械硬盘装上的盒子) 第一步:下载Ubuntu系统iso镜像文件 下载Ubuntu系统iso镜像文件,由于我是新手,下 ...

  5. 新东方雅思词汇---7.3、dioxide

    新东方雅思词汇---7.3.dioxide 一.总结 一句话总结: di(双)+oxide 英 [daɪ'ɒksaɪd]  美 [daɪ'ɑksaɪd]  n. 二氧化物 词组短语 carbon di ...

  6. 51nod 1270 dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1270 简单的线性dp,最近狂刷水题真的是...药丸 差值最大得话要么是峰 ...

  7. 【Java】访问权限

    一.访问权限修饰词 关键字 名称 本类 同一包中的类 子类 其他包中的类 public  接口访问权限 √ √ √ √ protected 继承访问权限 √ √ √ x 默认 包访问权限  √ √ x ...

  8. jquery制作选项卡

    思路:点击按钮后,先让所有的按钮的class属性都为“”,所有的div的display样式都为none:再让当前被点击按钮的class属性为active,以及所对应的div的display样式为blo ...

  9. DTO数据传输对象

    如果有多个对象需要传输到页面上需要用DTO传输

  10. padding和margin的用法

    在CSS中margin是指从自身边框到另一个容器边框之间的距离,就是容器外距离.在CSS中padding是指自身边框到自身内部另一个容器边框之间的距离,就是容器内距离. 一.padding 1.语法结 ...