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 ...
随机推荐
- spring MVC 全局的异常处理
1.使用SimpleMappingExceptionResolver实现异常处理 在Spring的配置文件applicationContext.xml中增加以下内容: <bean class=& ...
- openwrt MySQL移植
1 选择包 选择两个包,拷贝配置文件 cp products/mt7621/config_6080 .config 编译固件 openwrt 百万数据的优化, 执行脚本: mysql -u root ...
- poj 1742 Coins(二进制优化多重背包)
传送门 解题思路 多重背包,二进制优化.就是把每个物品拆分成一堆连续的\(2\)的幂加起来的形式,然后把最后剩下的也当成一个元素.直接类似\(0/1\)背包的跑就行了,时间复杂度\(O(nmlogc) ...
- js 盒子模型与盒子偏移量
js 盒子模型: 通过js中提供的一系列属性和方法获取页面中元素的样式信息值. 一.client系类—>只读属性不可设置 (当前元素的私有属性,和内容溢出没关系,如果给容器设置了高度,就采用设置 ...
- csv文件格式
弱渣今天第一次读Kaggle入门文章,知道train data,test data以及提供的result文件大都是以csv文件格式给出的. csv,全称 Comma-Separated Values, ...
- VS2010-MFC(常用控件:列表视图控件List Control 上)
转自:http://www.jizhuomi.com/software/195.html 列表视图控件简介 列表视图控件List Control同样比较常见,它能够把任何字符串内容以列表的方 ...
- 1.RCC of STM32F103
开发板用的是8Mhz晶振,即HSE=8,000,000 f103最大支持72Mhz,即SYSCLK=PLLCLK=72Mhz,HSE=8M,所以PLLM=9即可. /* HCLK = SYSCLK * ...
- <scrapy爬虫>爬取360妹子图存入mysql(mongoDB还没学会,学会后加上去)
1.创建scrapy项目 dos窗口输入: scrapy startproject images360 cd images360 2.编写item.py文件(相当于编写模板,需要爬取的数据在这里定义) ...
- 「APIO 2019」奇怪装置
题目 考虑推柿子 最开始的想法是如果两个\(t\)在\(mod\ B\)意义下相等,那么只需要比较一下\((t+\left \lfloor \frac{t}{B}\rfloor \right)mod\ ...
- java_过滤器
/** 过滤器: * File类中有两个和listFiles方法重载的方法,方法的参数就是过滤器 * listFiles(FileFilter filter) * java.io.FileFilter ...