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 ...
随机推荐
- windows下mysql8.0.x简单安装!
1.官网下载mysql安装包并解压到自己喜欢的目录 2.在解压的目录下,添加my.ini配置文件,内容如下:[mysqld]# 设置3306端口port=3306# 设置mysql的安装目录 下面是我 ...
- 校园商铺-2项目设计和框架搭建-10验证controller
1.新建package:com.csj2018.o2o.web.superadmin 2.建立AreaController.java package com.csj2018.o2o.web.super ...
- Hibernate与数据库交互方式和Hibernate常用的几个方法
第一种,适合sql语言水平比较高的人用 HQL(Hibernate Query Language) 面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分 ...
- clover无缘无故隐藏书签栏原因
可能是不小心按住了Ctrl+shift+B
- 多进程并发socket通信
实现多个客户端同时接入server端,并且可以同时向客户端发送信息 server端 def dunc(conn,client_addr): while True: data=conn.recv(102 ...
- Android Butterknife使用方法总结
原文链接:http://blog.csdn.net/donkor_/article/details/77879630 前言: ButterKnife是一个专注于Android系统的View注入框架,以 ...
- sql 查询问题
在做数据导出时候,当某个表某字段含有单引号时候老是报错,所以要排除这种情况: sql查询某表某字段值带单引号情况 select 主键码 from 馆藏书目库 where 题名 like '%''%' ...
- 20.multi_case06
# coding:utf-8 import asyncio # 通过create_task()方法 async def a(t): print('-->', t) await asyncio.s ...
- <每日一题>算法题:小球的下落距离
题目:小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面N米,球从他手里自由落下,每次落地后反跳回上次下落高度的一半,并以此类推知道全部落到地面不跳,求4个小球一共经过了多 ...
- POJ 1873 /// 状压+凸包
题目大意: 国王有一片森林,巫师需要从所有树中选出一些做成围栏把其他树围起来, 每棵树都有其对应的价值 v 和能作为围栏的长度 l 要求最小价值,若存在多种最小价值的方案则选择余下长度更少的 树木较少 ...