最初采用apache beanutils,性能很低。后来转为hutool,但不能复制指定格式的日期,所以采用性能很高的com.github.yangtu222.BeanUtils

它已经实现了 copyBean、copyList、copyArray、copyCollection。而hutool没有实现copyList、copyArray、copyCollection,需要自行封装实现。

pom.xml

<dependency>
<groupId>com.github.yangtu222</groupId>
<artifactId>BeanUtils</artifactId>
<version>1.0.9</version>
</dependency>

项目概览

实现的功能:

1、基本类型

2、Date

3、List/Parent

4、继承

注意要点:

1、如果复制 Date/Pojo,需要在目标类的相应属性上加@CopyProperty,基本类型/List不用。

ToBean

public class ToBean extends MyBase {
private Integer id;
private Double scope;
private String name;
@CopyProperty(convertor=DateConvertor.class)
private String myDate;
@CopyProperty(convertor=DateConvertor2.class)
private Date myDate2;
private List<ToChild> list;
@CopyProperty
private ToParent parent;
}

反之,如果从ToBean复制到FromBean,则也需要在FromBean的相应属性上加@CopyProperty。

FromBean

public class FromBean extends MyBase {
private Integer id;
private Double scope;
private String name;
@CopyProperty(convertor=DateConvertor2.class)
private Date myDate;
@CopyProperty(convertor=DateConvertor.class)
private String myDate2;
private List<FromChild> list;
@CopyProperty
private FromParent parent; }

如果不会从ToBean复制到FromBean,那么FromBean里的相应属性不需要加@CopyProperty。

2、日期转换需要实现BeanCopyConvertor

DateConvertor:Date-->String

public class DateConvertor implements BeanCopyConvertor<Date, String> {
@Override
public String convertTo(Date object) {
if( object == null ) {
object = new Date();
}
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
return format.format(object);
}
}

DateConvertor2:String--->Date

public class DateConvertor2 implements BeanCopyConvertor<String,Date> {
@Override
public Date convertTo(String object) {
if( object == null ) {
return null;
}
return DateUtil.parse(object, "yyyy-MM-dd");
}
}

测试1:from--->to

@Test
public void from2to() throws Exception {
FromBean from = new FromBean();
from.setId(1);
from.setScope(98.6);
from.setName("遥远2");
from.setMyDate(DateTime.now());
from.setMyDate2(DateUtil.now()); from.setIsDelete(false);
from.setList(CollUtil.newArrayList(new FromChild("子1"),new FromChild("子2"),new FromChild("子3")));
from.setParent(new FromParent((byte) 'a')); ToBean toBean = BeanCopyUtils.copyBean(from, ToBean.class);
Console.log(toBean);
}

输出:

ToBean(
super=MyBase(isDelete=false),
id=1,
scope=98.6,
name=遥远2,
myDate=2019-01-16,
myDate2=2019-01-16 00:00:00,
list=[
FromChild(childName=子1),
FromChild(childName=子2),
FromChild(childName=子3)
],
parent=ToParent(sign=97)
)

测试2:to-->from

@Test
public void to2from() throws Exception {
ToBean to = new ToBean();
to.setId(1);
to.setScope(98.6);
to.setName("遥远2");
to.setMyDate(DateUtil.now());
to.setMyDate2(DateTime.now()); to.setIsDelete(false);
to.setList(CollUtil.newArrayList(new ToChild("子1"),new ToChild("子2"),new ToChild("子3")));
to.setParent(new ToParent((byte) 'b')); FromBean fromBean = BeanCopyUtils.copyBean(to, FromBean.class);
Console.log(fromBean);
}

输出:

FromBean(
id=1,
scope=98.6,
name=遥远2,
myDate=2019-01-16 00:00:00,
myDate2=2019-01-16,
list=[
ToChild(super=com.ebc.beancopy.base.ToChild@6483f5ae,childName=子1),
ToChild(super=com.ebc.beancopy.base.ToChild@b9afc07,childName=子2),
ToChild(super=com.ebc.beancopy.base.ToChild@382db087,childName=子3)
],
parent=FromParent(sign=98))

以上是copyBean。下边是copyList和copyArray的测试

测试3:copyList

@Test
public void testCopyList() throws Exception {
List<FromChild> fromList = CollUtil.newArrayList(new FromChild("子1"),new FromChild("子2"),new FromChild("子3"));
List<ToChild> toList = BeanCopyUtils.copyList(fromList, ToChild.class);
Console.log(toList);
}

输出:

[
ToChild(super=com.ebc.beancopy.base.ToChild@366e2eef, childName=子1),
ToChild(super=com.ebc.beancopy.base.ToChild@6df97b55, childName=子2),
ToChild(super=com.ebc.beancopy.base.ToChild@3cbbc1e0, childName=子3)
]

测试4:copyArray

@Test
public void testCopyArray() throws Exception {
FromChild [] from = {new FromChild("子1"),new FromChild("子2"),new FromChild("子3")};
ToChild [] to = BeanCopyUtils.copyArray(from, ToChild.class);
Console.log(to);
}

输出:

[
ToChild(super=com.ebc.beancopy.base.ToChild@6537cf78, childName=子1),
ToChild(super=com.ebc.beancopy.base.ToChild@67b6d4ae, childName=子2),
ToChild(super=com.ebc.beancopy.base.ToChild@34b7bfc0, childName=子3)
]

bean copy的更多相关文章

  1. Orika的使用姿势,Orika java bean copy 框架

    ### 这个java bean copy 比较好用 https://www.jianshu.com/p/271cf6976a3d

  2. cglib、orika、spring等bean copy工具性能测试和原理分析

    简介 在实际项目中,考虑到不同的数据使用者,我们经常要处理 VO.DTO.Entity.DO 等对象的转换,如果手动编写 setter/getter 方法一个个赋值,将非常繁琐且难维护.通常情况下,这 ...

  3. java泛型&bean copy list

    参考:https://www.oracle.com/technetwork/cn/articles/java/juneau-generics-2255374-zhs.html E:元素K:键N:数字T ...

  4. 编写更少量的代码:使用apache commons工具类库

    Commons-configuration   Commons-FileUpload   Commons DbUtils   Commons BeanUtils  Commons CLI  Commo ...

  5. Apache Commons 工具集

    一.Commons BeanUtils http://jakarta.apache.org/commons/beanutils/index.html 说明:针对Bean的一个工具集.由于Bean往往是 ...

  6. Apache Commons 工具集使用简介

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.我选了一些比较常用的项目做简单介绍.文中用了很多网上现成的东西,我只是做了一个汇总整理. 一.Comm ...

  7. Apache common包应用集合

    一.Commons BeanUtils http://jakarta.apache.org/commons/beanutils/index.html 说明:针对Bean的一个工具集.由于Bean往往是 ...

  8. CGLIB学习笔记

    0 概述 CGLIB基于ASM实现.提供比反射更为强大的动态特性.使用CGLIB可以非常方便的实现的动态代理. 0.1 CGLIB包结构 net.sf.cglib.core    底层字节码处理类. ...

  9. Apache Jakarta Commons 工具集简介

    Apache Jakarta Commons 工具集简介[转] Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.我选了一些比较常用的项目做简单介绍.文 ...

随机推荐

  1. koa的教程

    https://github.com/bmcmahen/koa-mongo-sessionhttp://www.fkwebs.com/2333.htmlhttps://segmentfault.com ...

  2. ES01 数据类型、正则表达式、身份证校验

    1 基本数据类型 参见W3C的教程即可 2 正则表达式 参考博文:点击前往 3 身份证校验 参考博文:点击前往 <div class="panel panel-primary" ...

  3. Angular04 组件动态地从外部接收值、在组件中使用组件

    一.组件从外部接收值 1 修改组件的ts文件,让组件的属性可以从外部接收值 1.1 导入Input注解对象 1.2 在属性变量前面添加 @Input() 注解 1.3 去掉构造器中的属性变量赋值语句 ...

  4. OpenGL超级宝典完整源码(第五版)

    链接:https://pan.baidu.com/s/1dGQkk4T 密码:wu44 Visual Studio 2017配置OpenGL https://blog.csdn.net/qiangbi ...

  5. 高性能MySQL笔记-第5章Indexing for High Performance-005聚集索引

    一.聚集索引介绍 1.什么是聚集索引? InnoDB’s clustered indexes actually store a B-Tree index and the rows together i ...

  6. ZROI2018普转提day6t3

    传送门 分析 居然卡哈希数,万恶的出题人...... 感觉我这个方法似乎比较呆,我的代码成功成为了全网最慢的代码qwq 应该是可以直接哈希的 但由于我哈希学的不好又想练练线段树维护哈希,于是就写了个线 ...

  7. bzoj4318 OSU!

    传送门 题目 osu 是一款群众喜闻乐见的休闲软件.  我们可以把osu的规则简化与改编成以下的样子:  一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n ...

  8. Luogu 3168 [CQOI2015]任务查询系统

    区间修改单点查询,又观察到是一个k小,考虑主席树上做差分 一开始样例疯狂挂,后来发现主席树在一个历史版本上只能修改一次,所以要开2*n个根结点,记录一下每个时间对应的根结点编号 然后80分,考虑到当一 ...

  9. Luogu 4867 Gty的二逼妹子序列

    BZOJ3809,是权限题. 我永远喜欢莫队. 先莫队一下移下左右指针,然后用一个数据结构维护一下区间$[a, b]$中的颜色的值,跟着指针移动一起修改修改,每一次$query$的时候就相当于查询一下 ...

  10. sed编辑器使用(转)

    1.Sed简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后, ...