对象的克隆,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
对象的克隆,Dozer的使用的更多相关文章
- java对象 深度克隆(不实现Cloneable接口)和浅度克隆
		
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt128 为什么需要克隆: 在实际编程过程中,我们常常要遇到这种情况:有一个对象 ...
 - Java基础学习 —— 对象的克隆
		
对象的克隆分为对象的浅克隆和深克隆 一.对象的浅克隆 注意事项: 1.如果一个对象需要调用clone的方法克隆,那么该对象必须要实现Cloneable接口 2.Cloneable对象只是一个标识对象, ...
 - 【JAVA零基础入门系列】Day14 Java对象的克隆
		
今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢 ...
 - Java对象的克隆和深浅问题
		
Java实现克隆的方式 Java实现克隆的方式有如下两种, 推荐采用实现Cloneable接口的方式 实现Cloneable接口, 重写clone方法, 调用父类的clone方法 还有另一种方法, 不 ...
 - java基础知识总结--对象的克隆
		
前提:在Java语言中所有的类的都是缺省的继承Java语言中的Object类的, protected native Object clone() throws CloneNotSupportedExc ...
 - Java基础--对象的克隆
		
文章转载自https://www.cnblogs.com/Qian123/p/5710533.html 阅读目录 为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 假如说你想复制一 ...
 - Java对象的克隆
		
今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢 ...
 - net对象的克隆
		
class Person { public string name; public List<string> hobby; } void main() { Person p1 = new ...
 - 设计模式系列之原型模式(Prototype Pattern)——对象的克隆
		
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
 - JAVA笔记10__Math类、Random类、Arrays类/日期操作类/对象比较器/对象的克隆/二叉树
		
/** * Math类.Random类.Arrays类:具体查JAVA手册...... */ public class Main { public static void main(String[] ...
 
随机推荐
- Docker基于容器创建镜像
			
docker commit -m "提交信息" -a "作者信息" imgId imgName
 - timer使用方法
			
, HEART_EXPIRE}; , }; /* 第一次调用要多长时间 */ struct itimerval it; it.it_interval = tv_interval; it.it_valu ...
 - Gym - 101503I 利用到图论的构造
			
比赛的时候没有注意到 给出的up矩阵 能使我们随便选一列 确定这一列的rank 这样我们得出每一行列的rank 进行构图 大->小 然后从大到小放 当前放的点 和他有因果关系并且比他大的点必须已 ...
 - KNN 算法,以及与Kmeans的简单对比
			
KNN与Kmeans感觉没啥联系,但是名字挺像的,就拿来一起总结一下吧. 初学者的总结. KNN是监督学习,Kmeans是无监督学习. KNN用于分类,Kmeans用于聚类. 先说KNN: 对于KNN ...
 - 报错org.apache.ibatis.binding.BindingException: Type interface com.atguigu.mybatis.bean.dao.EmployeeMapper is not known to the MapperRegistry.
			
报错org.apache.ibatis.binding.BindingException: Type interface com.atguigu.mybatis.bean.dao.EmployeeMa ...
 - DatePicker日期与时间控件
			
DatePicker日期与时间控件 一.简介 二.方法 最日常的使用方法了 日期控件DatePicker 时间控件TimePicker 月份从0开始 三.代码实例 效果图: 代码: fry.Activ ...
 - mysql中去除重复字段-distinct
			
1.注意事项 使用distinct命令时需要放在查询条件的开头,否则会报错.如果需要查询的项目很多但只针对某一个字段使用distinct的,则可以利用内容拼接的方式来实现. --基本查询 SELECT ...
 - Android DDMS ADB启动失败错误解决!
			
ADB server didn't ACK && make sure the plugin is properly configured! adb启动失败一般是端口被占用! 解决方法和 ...
 - VMware虚拟机克隆Linux系统引起的网卡问题
			
1. 手动配置静态网卡地址不生效2. 网卡名变成了eth1[root@localhost network-scripts]# ls |grep ifcfg ifcfg-eth0 ifcfg-lo [r ...
 - MongoCola使用教程 2 - MongoDB的Replset 初始化和配置
			
前言 首先再次感谢博客园的各位朋友.正是你们的关注才让我有信心将这个工具开发下去. 这周同样也有热心网友对于MongoCola存在的问题给予了反馈. 这次工具更新到了版本1.20,强化的地方是增加了R ...