复制 对象非空属性 实现及其原理
发布日期:2021-06-20 05:37:29 浏览次数:11 分类:技术文章

本文共 3098 字,大约阅读时间需要 10 分钟。

利用Spring框架的BeanUtils实现

代码如下:

/**     * 获取到对象中属性为null的属性名     * @param source     * @return 要拷贝的对象     */    private static String[] getNullPropertyNames(Object source) {        final BeanWrapper src = new BeanWrapperImpl(source);        //获取包装对象的PropertyDescriptors        java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();        Set
emptyNames = new HashSet
(); for (java.beans.PropertyDescriptor pd : pds) { //获取属性值为空的属性名 Object srcValue = src.getPropertyValue(pd.getName()); if (srcValue == null) emptyNames.add(pd.getName()); } String[] result = new String[emptyNames.size()]; return emptyNames.toArray(result); } /** * 拷贝对象非空属性值 * @param source 原对象 * @param target 目标对象 */ public static void copyPropertiesIgnoreNull(Object source, Object target) { BeanUtils.copyProperties(source, target, getNullPropertyNames(source)); }

BeanUtils原理

BeanWrapper 是Spring提供的一个用来操作javaBean属性的工具,使用它可以直接修改一个对象的属性。

对于bean属性的操作,大家熟知的主要有下面这些工具类:

  • 1.Apache的BeanUtils和PropertyUtils
  • 2.cglib的BeanMap和BeanCopier
  • 3.spring的BeanUtils

Spring中BeanWrapper 的主要功能在于:

  • 1.支持设置嵌套属性
  • 2.支持属性值的类型转换(设置ConversionService)
  • 3.提供分析和操作标准JavaBean的操作:获取和设置属性值(单独或批量),获取属性描述符以及查询属性的可读性/可写性的能力。

BeanWrapper本身是一个接口,它提供了一整套处理Bean的方法。源码如下:

public interface BeanWrapper extends ConfigurablePropertyAccessor {	 //为数组和集合自动增长指定一个限制。在普通的BeanWrapper上默认是无限的。	void setAutoGrowCollectionLimit(int autoGrowCollectionLimit);	//返回数组和集合自动增长的限制。	int getAutoGrowCollectionLimit();    //如果有的话,返回由此对象包装的bean实例	Object getWrappedInstance();	//返回被包装的JavaBean对象的类型。	Class
getWrappedClass(); //获取包装对象的PropertyDescriptors(由标准JavaBeans自省确定)。 PropertyDescriptor[] getPropertyDescriptors(); //获取包装对象的特定属性的属性描述符。 PropertyDescriptor getPropertyDescriptor(String propertyName) throws InvalidPropertyException;}

上面的BeanWrapper是基于4.3.6版本的,这个接口在4.1版本之后略有改动。BeanWrapperImpl是BeanWrapper的实现类,BeanWrapperImpl的父类是AbstractNestablePropertyAccessor,通过这个使得BeanWrapper具有处理属性的能力。

下面是一个使用BeanWrapper 包装对象的例子:

package com.glmapper.spring.test;import org.springframework.beans.BeanWrapper;import org.springframework.beans.PropertyAccessorFactory;import org.springframework.beans.PropertyValue;/** * BeanWrapper 测试类 */public class BeanWrapperTest {    public static void main(String[] args) {        User user=new User();        //通过PropertyAccessorFactory将user对象封装成BeanWrapper        BeanWrapper bw=PropertyAccessorFactory.forBeanPropertyAccess(user);        //方式一:直接对属性值进行设置        bw.setPropertyValue("userName", "张三");        //方式二:通过PropertyValue进行设置        PropertyValue pv=new PropertyValue("userName","李四");        bw.setPropertyValue(pv);                        System.out.println(user.getUserName());    }}//一个User类class User{    private String userName;    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }}

在Spring中,有很多Bean属性的操作都是通过BeanWrapper来完成的,比如常见的HttpServletBean的属性设置就是。

 

参考链接:https://juejin.im/post/5a77f3eb6fb9a06361085451
来源:掘金

转载地址:https://blog.csdn.net/h2453532874/article/details/92652953 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:MYSQL JSON的操作函数 -- JSON_SET (), JSON_INSERT(), and JSON_REPLACE()
下一篇:Spring Junit test 如何实现

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年03月22日 04时49分40秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

linux 7 磁盘空间太小,Linux下磁盘保留空间的调整,解决df看到的空间和实际磁盘大小不一致的问题... 2019-04-21
linux下mysql 备份方法,Linux下mysql数据库备份方法小结 2019-04-21
bootstrap 页面垂直居中_iframe中如何让layer提示框显示在垂直居中的位置 2019-04-21
肺部ct重建_胸片检查容易漏诊肺癌,去年正常今年晚期常发生,体检一定要做CT... 2019-04-21
3dmax如何拆分模型_3D建模大佬如何制作出惊艳四方的游戏建模,看完这篇文章我知道了... 2019-04-21
x86so文件装换成arm64位_64位系统正式发布说明及介绍!! 2019-04-21
for循环中取出最大最小 累加_LeetCode之长度最小的子数组 2019-04-21
如何打开老公人脸识别_【话题】南宁已有小区启用人脸识别门禁,有人点赞有人忧... 2019-04-21
makex机器人程序_机器人教育为相城青少年叩开科学世界大门 2019-04-21
一寸照纯红色底图片_Ella陈嘉桦也是“时髦精”,穿玫红色西装配拼色半身裙,高级洋气... 2019-04-21
米哈游客户端笔试题_Garena校招 游戏客户端开发通关面经 2019-04-21
airpodspro没有弹窗_使用AirPods Pro一天的主观感受 2019-04-21
创建物化视图commit_视图及范式 2019-04-21
函数传参字典_Python新手上车17:函数传递任意多个参数 2019-04-21
去掉数组最后一个元素_【一天一大 lee】在排序数组中查找元素的第一个和最后一个位置 (难度:中等) Day20201201... 2019-04-21
秦九韶算法递推公式_算法讲解之复杂度分析 2019-04-21
添加绝对路径_网站中如何添加绝对路径 2019-04-21
python房价数据分析波士顿代码数据_python数据分析-波士顿房价预测-Go语言中文社区... 2019-04-21
redis线程阻塞原因排插_Redis阻塞原因详解 2019-04-21
labview自动保存报表_基于LabVIEW的Excel报表的自动生成功能 2019-04-21