现在有个复杂对象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. EF Code-First 学习之旅 配置一对一的关系

    1对1.1对0 的关系 例如:Entity1与零个或一个Entity2的实例有关系 public class Student { public Student() { } public int Stu ...

  2. const作用

    const有以下几个作用: 1. 定义const常量,具有不可变性.eg. const int MAX = 100;  int Array[MAX]; 2. 进行类型检查,使编译器对处理内容有更多的了 ...

  3. activity启动模式之singleInstance

    activity启动模式之singleInstance 一.简介 Log.d("C2", getTaskId()+"");里面的getTaskId()可以获取a ...

  4. ggplot 画 条形图

    今天开会谈了半天自己的研究结果,同事皱着眉头,第一好像她没大听懂,第二感觉眼前一亮,但不知怎么落地.落地这个事情,交给时间吧,我想练熟我的分析. 今天搞了个简单的,条形图. 就是EXCEL里面经常玩的 ...

  5. yii2:多条件多where条件下碰到between时,between语句如何处理呢?

    yii2:多条件多where条件下碰到between时,between语句如何处理呢? 我有一张表:id,name,telphone,ticket_no,status,create_time等字段, ...

  6. Ajax-03 XmlHttpRequest实现Ajax

    概述 Ajax主要就是使用XmlHttpRequest对象来完成请求的操作,该对象在主流浏览器中均存在 XmlHttpRequest对象的主要方法 a. void open(String method ...

  7. 【MAF】MAF插件框架简介

    引言    Managed Add-In Framework是一个插件式框架.它有两大作用,一个是解耦,插件和宿主由7个管道组成,两边都有适配器Adapter管道,能最大程度地降低插件和宿主的耦合度: ...

  8. 模拟form提交数据

    最近在做一个项目,发现ajax不能enctype=”multipart/form-data” 属性的表单,没办法,只能使用form表单直接提交的方法了,但是form表单直接提交会跳转页面,这样很不友好 ...

  9. Vue: webpack js basic structure

    vue webpack所用基础包: nom install vue vue-loader webpack webpack-cli webpack-dev-server vue-template-com ...

  10. JAVA代码反编译笔记

    最近有个朋友说有个java弄的软件是从朋友处拿来的,由于进行了网卡地址绑定,不修改网卡地址无法使用,叫我看看有无办法破解,之前都很少玩这些东西,本着帮忙的心态,尝试了下,便有了一下的笔记内容. 1.使 ...