BeanUtils工具类copyProperties方法缺点及解决
使用类为spring-beans:4.3.13release包中的 org.springframework.beans.BeanUtils BeanUtils.copyProperties(Object source, Object target);
该方法会将source中同名属性的值赋值给target中的同名属性。(前提是source中的改属性类型属于target中该属性类型【即为相同类或其子类,否则目标属性还是为原默认值】)
import com.alibaba.fastjson.JSON;
import lombok.Data;
import org.junit.Test;
import org.springframework.beans.BeanUtils; import java.util.Arrays;
import java.util.List; /**
* @author
* @date 2019/10/26
*/
public class BeanUtil {
public static void main(String[] args) {
Bean2 bean2 = new Bean2();
bean2.setIntField(1);
bean2.setStrField("str");
bean2.setObjField("obj");
bean2.setListIntegerField(Arrays.asList("1","2assdsdsf","3"));
bean2.setObjField1("1");
Bean1 bean1 = new Bean1(); //属性中有元素不满足目标属性时依旧赋值成功Bean1.listIntegerField),未对能强转成功的属性做赋值处理(Bean1.objField1)
BeanUtils.copyProperties(bean2,bean1); System.out.println("bean2:\t"+bean2);
System.out.println("bean1:\t"+bean1);
System.out.println("bean1.getListIntegerField:\t"+bean1.getListIntegerField().get(0));//调用到具体异常元素再抛出异常 System.out.println("--------------------分割线--------------------"); Bean1 bean11 = new Bean1();
bean11.setIntField(1);
bean11.setStrField("str");
bean11.setObjField("obj");
bean11.setListIntegerField(Arrays.asList(1,2,3));
bean11.setObjField1(1);
Bean2 bean21 = new Bean2(); //Bean2.objField1 类型大于Bean1.objField1类型,赋值成功
BeanUtils.copyProperties(bean11,bean21); System.out.println("bean11:\t"+bean11);
System.out.println("bean21:\t"+bean21);
System.out.println("bean21.getListIntegerField:\t"+bean21.getListIntegerField());
/*
运行结果:
bean2: BeanUtil.Bean2(intField=1, strField=str, objField=obj, objField1=1, listIntegerField=[1, 2assdsdsf, 3])
bean1: BeanUtil.Bean1(intField=1, strField=str, objField=obj, objField1=null, listIntegerField=[1, 2assdsdsf, 3])
bean1.getListIntegerField: 1
--------------------分割线--------------------
bean11: BeanUtil.Bean1(intField=1, strField=str, objField=obj, objField1=1, listIntegerField=[1, 2, 3])
bean21: BeanUtil.Bean2(intField=1, strField=str, objField=obj, objField1=1, listIntegerField=[1, 2, 3])
bean21.getListIntegerField: [1, 2, 3] */
}
@Test
public void optimizeCopyProperties(){
Bean2 bean2 = new Bean2();
bean2.setIntField(1);
bean2.setStrField("str");
bean2.setObjField("obj");
// bean2.setListIntegerField(Arrays.asList("1assdsdsf","2","3"));
bean2.setListIntegerField(Arrays.asList("1","2","3"));
bean2.setObjField1("1");
//借助json工具类,底层以字符串实现强转。对能强转成功的属性做赋值并赋值成功,若同名属性值强转赋值失败则抛出异常
Bean1 bean1 = JSON.parseObject(JSON.toJSONBytes(bean2), Bean1.class);
System.out.println("bean2:\t"+bean2);
System.out.println("bean1:\t"+bean1);
System.out.println("bean1.getListIntegerField:\t"+bean1.getListIntegerField());
/* 运行结果:
bean2: BeanUtil.Bean2(intField=1, strField=str, objField=obj, objField1=1, listIntegerField=[1, 2, 3])
bean1: BeanUtil.Bean1(intField=1, strField=str, objField=obj, objField1=1, listIntegerField=[1, 2, 3])
bean1.getListIntegerField: [1, 2, 3]
*/
}
@Data
public static class Bean1{
private int intField;
private String strField;
private Object objField;
private Integer objField1;
private List<Integer> listIntegerField;
}
@Data
public static class Bean2{
private int intField;
private String strField;
private Object objField;
private Object objField1;
private List<String> listIntegerField;
}
}
总结:可用阿里的json转换工具处理类似的属性赋值。其强转赋值对能用字符串强转的类型赋值更智能,属性元素的异常赋值检查也更严格。
BeanUtils工具类copyProperties方法缺点及解决的更多相关文章
- 第13天 JSTL标签、MVC设计模式、BeanUtils工具类
第13天 JSTL标签.MVC设计模式.BeanUtils工具类 目录 1. JSTL的核心标签库使用必须会使用 1 1.1. c:if标签 1 1.2. c:choos ...
- 利用BeanUtils工具类封装表单数据
一.BeanUtils工具类的使用 1.首先导入BeanUtils工具类的jar包 commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar 2.se ...
- BeanUtils 工具类
一.BeanUtils 概述 BeanUtils 是阿帕奇提供的一套专门用于将一些数据封装到java对象中的工具类; 名词:javaBean:特定格式的java类称为java ...
- JavaWeb 之 BeanUtils 工具类
在上一个用户登录案例中,当从浏览器接收参数后,还需要创建 JavaBean 类,对其的属性每一项赋值,如果属性少,可以手动完成,但是当属性非常多,这时就发现非常不方便,在这里提供一个可以封装 Java ...
- JDBC--使用beanutils工具类操作JavaBean
1.在JavaEE中,Java类的属性通过getter,setter来定义: 2.可使用BeanUtils工具包来操作Java类的属性: --Beanutils是由Apache公司开发,能够方便对Be ...
- Hutool中那些常用的工具类和方法
Hutool中那些常用的工具类和方法 Hutool是一个Java工具包,它帮助我们简化每一行代码,避免重复造轮子.如果你有需要用到某些工具方法的时候,不妨在Hutool里面找找,可能就有.本文将对Hu ...
- 大数据学习--day07(冒泡排序、Arrays工具类、方法可变参数)
冒泡排序.Arrays工具类.方法可变参数 冒泡排序之前写过,略 Arrays工具类 二分法查询 public static int binarySearch(int[] a,int key) 头信息 ...
- 【Android 工具类】经常使用工具类(方法)大全
收集经常使用的工具类或者方法: 1.获取手机分辨率 /** * 获取手机分辨率 */ public static String getDisplayMetrix(Context context) { ...
- OpenJDK源码研究笔记(四)-编写和组织可复用的工具类和方法
本篇主要讲解java.util.Arrays这个针对数组的工具类. 1.可复用的工具类和方法. 这个工具类里,包含很多针对数组的工具方法,如 排序.交换.二分查找.比较.填充.复制.hashcode ...
随机推荐
- ES6 学习 -- Generator函数
(1)语法说明:Generator函数其实是一个普通函数,其有两个特点,一是,function关键字与函数名之间有一个星号(*):二是Generator函数内部使用yield表达式,定义不同的状态,然 ...
- Java 基础 - 装箱, 拆箱
总结 1-装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的.(xxx代表对应的基本数据类型).例如:在装箱的时候自动调用的是Integer的 ...
- SpringCloudBus
不重启微服务的情况下更新配置 配置服务端 tensquare_config配置依赖 <dependency> <groupId>org.springframework.clou ...
- BZOJ 4557 (JLOI 2016) 侦查守卫
4557: [JLoi2016]侦察守卫 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 493 Solved: 342 [Submit][Status ...
- day 56 Django基础五之django模型层(二)多表操作
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...
- Integer 类和 int 基本数据类型的区别
public static void main(String[] args) { Integer i = 10; Integer j = 10; System.out.println(i == j); ...
- Python自学--part1
概要 Python介绍 Python安装 Hello World程序 变量 字符编码 用户输入 pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语句 表达式while 循环 表达 ...
- HDU 1147 /// 判断两线段相交
题目大意: 给定n条线段的端点 依次放上n条线段 判断最后在最上面(不被覆盖)的线段有哪些 到当前线段后 直接与之前保存的未被覆盖的线段判断是否相交就可以了 #include <cstdio&g ...
- Single Thread Execution 能通过这座桥的只有一个人
直奔主题, Single Thread Execution也称作Critical Section(临界区),范例如下: public class SingleThreadGate { public s ...
- Java多线程设计模式系列
通过几天的认真阅读,发现这是一本难得一见的好书,为了加深巩固学习成功,我打算将书中的例子全部自己实现一遍,特此记录下来也方便其他朋友学习. 第一章,java语言的线程 单线程程序:打印10000次go ...