Android 开发中的代码片段(2)复制对象之间的属性值
前言
开发中会遇到这样的一个情况,我们得到一个dto对象,里面有几十个属性值,需要将这几十个属性值的N个通过VO传输另外一个地方,一般我们的做法是:
创建VO类,new vo() 对象,通过vo.set(dto.get)的方式不断的设置值。
但是这种方式在属性少量的情况之下还是没有问题,但是在属性不断变化的情况下就令人烦恼了,但是我们可以选择使用反射来完成A对象拷贝到B对象的这一过程。
其主要原理是通过反射获取到A对象的get方法和数据类型,然后截取get之后的字符串,拼接成set方法,再通过反射调用B的set方法和传值。
代码
public class CopyPropertiesUtil { /** * 利用反射实现对象之间属性复制 * * @param from * @param to */ public static void copyProperties(Object from, Object to) throws Exception { copyPropertiesExclude(from, to, null); } /** * 复制对象属性 * * @param from * @param to * @param excludsArray 排除属性列表 * @throws Exception */ @SuppressWarnings("unchecked") public static void copyPropertiesExclude(Object from, Object to, String[] excludsArray) throws Exception { List<String> excludesList = null; if (excludsArray != null && excludsArray.length > 0) { excludesList = Arrays.asList(excludsArray); //构造列表对象 } Method[] fromMethods = from.getClass().getDeclaredMethods(); Method[] toMethods = to.getClass().getDeclaredMethods(); Method fromMethod = null, toMethod = null; String fromMethodName = null, toMethodName = null; for (int i = 0; i < fromMethods.length; i++) { fromMethod = fromMethods[i]; fromMethodName = fromMethod.getName(); if (!fromMethodName.contains("get") || fromMethodName.contains("getId")) continue; //排除列表检测 if (excludesList != null && excludesList.contains(fromMethodName.substring(3).toLowerCase())) { continue; } toMethodName = "set" + fromMethodName.substring(3); toMethod = findMethodByName(toMethods, toMethodName); if (toMethod == null) continue; Object value = fromMethod.invoke(from, new Object[0]); if (value == null) continue; //集合类判空处理 if (value instanceof Collection) { Collection newValue = (Collection) value; if (newValue.size() <= 0) continue; } toMethod.invoke(to, new Object[]{value}); } } /** * 对象属性值复制,仅复制指定名称的属性值 * * @param from * @param to * @param includsArray * @throws Exception */ @SuppressWarnings("unchecked") public static void copyPropertiesInclude(Object from, Object to, String[] includsArray) throws Exception { List<String> includesList = null; if (includsArray != null && includsArray.length > 0) { includesList = Arrays.asList(includsArray); //构造列表对象 } else { return; } Method[] fromMethods = from.getClass().getDeclaredMethods(); Method[] toMethods = to.getClass().getDeclaredMethods(); Method fromMethod = null, toMethod = null; String fromMethodName = null, toMethodName = null; for (int i = 0; i < fromMethods.length; i++) { fromMethod = fromMethods[i]; fromMethodName = fromMethod.getName(); if (!fromMethodName.contains("get")) continue; //排除列表检测 String str = fromMethodName.substring(3); if (!includesList.contains(str.substring(0, 1).toLowerCase() + str.substring(1))) { continue; } toMethodName = "set" + fromMethodName.substring(3); toMethod = findMethodByName(toMethods, toMethodName); if (toMethod == null) continue; Object value = fromMethod.invoke(from, new Object[0]); if (value == null) continue; //集合类判空处理 if (value instanceof Collection) { Collection newValue = (Collection) value; if (newValue.size() <= 0) continue; } toMethod.invoke(to, new Object[]{value}); } } /** * 从方法数组中获取指定名称的方法 * * @param methods * @param name * @return */ public static Method findMethodByName(Method[] methods, String name) { for (int j = 0; j < methods.length; j++) { if (methods[j].getName().equals(name)) return methods[j]; } return null; } }
最后
未完待续、敬请期待!
我的博客地址
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android 开发中的代码片段(1)
前言 收集Android开发中常用的一些代码片段,留存记录 代码 禁止截屏 对安全性要求比较高的APP可以用得到 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE) 禁止输入特殊字符 经历过 Tester 的无限摧残得出的结果,主要是使用正则表达式来完成校验。 /** * 禁止输入表情以及特殊字符 */ public static class EmojiExcludeFilter implements InputFilter { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { for (int i = start; i < end; i++) { int type = Character.getType(source.charAt(i)); if (type == Character.SURROGATE || type == Ch...
- 下一篇
HTML5应用 + Cordova = 平台相关的混合应用
Jerry之前的一篇文章 SAP Fiori应用的三种部署方式 曾经提到SAP Fiori应用的三种部署方式: On Premise环境下以ABAP BSP应用作为Fiori应用部署和运行的载体 部署并运行在On Cloud环境下,比如SAP云平台 用Cordova打包成平台原生应用安装在移动设备上 今天这篇文章我们就来专门聊聊第三种方式,也就是SAP移动应用的解决方案之一: 使用Cordova将前端应用打包成一个和移动平台相关的混合移动应用。 本文首先由Jerry向大家对Cordova做一个总体介绍,然后由Jerry的同事,SAP成都研究院Cloud for Customer开发团队的Yang Joey(他的背景介绍可以在这篇文章SAP成都研究院C4C光明左使:SAP Cloud for Customer使用SAP UI5的独特之处找到)向大家介绍Cordova是如何应用在SAP C4C移动应用里的。 除了Cordova外,业界还有很多其他的移动开发框架,比如Facebook的React Native,虽然据我所知SAP的标准产品没有用到它,但我从我的同事,拥有“集产品经理,开发人员...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Linux系统CentOS6、CentOS7手动修改IP地址