复制 对象非空属性 实现及其原理
发布日期: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(); SetemptyNames = 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年03月22日 04时49分40秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
linux下mysql 备份方法,Linux下mysql数据库备份方法小结
2019-04-21
肺部ct重建_胸片检查容易漏诊肺癌,去年正常今年晚期常发生,体检一定要做CT...
2019-04-21
x86so文件装换成arm64位_64位系统正式发布说明及介绍!!
2019-04-21
for循环中取出最大最小 累加_LeetCode之长度最小的子数组
2019-04-21
如何打开老公人脸识别_【话题】南宁已有小区启用人脸识别门禁,有人点赞有人忧...
2019-04-21
makex机器人程序_机器人教育为相城青少年叩开科学世界大门
2019-04-21
米哈游客户端笔试题_Garena校招 游戏客户端开发通关面经
2019-04-21
airpodspro没有弹窗_使用AirPods Pro一天的主观感受
2019-04-21
创建物化视图commit_视图及范式
2019-04-21
函数传参字典_Python新手上车17:函数传递任意多个参数
2019-04-21
秦九韶算法递推公式_算法讲解之复杂度分析
2019-04-21
添加绝对路径_网站中如何添加绝对路径
2019-04-21
redis线程阻塞原因排插_Redis阻塞原因详解
2019-04-21
labview自动保存报表_基于LabVIEW的Excel报表的自动生成功能
2019-04-21