Android 开发中的代码片段(2)复制对象之间的属性值

简介: 前言开发中会遇到这样的一个情况,我们得到一个dto对象,里面有几十个属性值,需要将这几十个属性值的N个通过VO传输另外一个地方,一般我们的做法是:创建VO类,new vo() 对象,通过vo.set(dto.get)的方式不断的设置值。

前言

开发中会遇到这样的一个情况,我们得到一个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;
       }
}

最后

未完待续、敬请期待!
我的博客地址

img_1ee92a858822d3b1d90a45e40e7b1042.jpe
FullScreenDeveloper
目录
相关文章
|
13天前
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的海洋中,自定义控件是那片璀璨的星辰。它不仅让应用界面设计变得丰富多彩,还提升了用户体验。本文将带你探索自定义控件的核心概念、实现过程以及优化技巧,让你的应用在众多竞争者中脱颖而出。
|
13天前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
54 1
|
14天前
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
42 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
|
12天前
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件基础与进阶
【10月更文挑战第5天】在Android应用开发中,自定义控件是提升用户体验和界面个性化的重要手段。本文将通过浅显易懂的语言和实例,引导你了解自定义控件的基本概念、创建流程以及高级应用技巧,帮助你在开发过程中更好地掌握自定义控件的使用和优化。
25 10
|
4天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
22 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
12天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
13天前
|
前端开发 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的世界里,自定义控件如同画家的画笔,能够绘制出独一无二的界面。通过掌握自定义控件的绘制技巧,开发者可以突破系统提供的界面元素限制,创造出既符合品牌形象又提供卓越用户体验的应用。本文将引导你了解自定义控件的核心概念,并通过一个简单的例子展示如何实现一个基本的自定义控件,让你的安卓应用在视觉和交互上与众不同。
|
9天前
|
消息中间件 存储 前端开发
资深Android开发的5个经典面试题
本文首发于公众号“AntDream”,欢迎关注。文章详细解答了五个常见的Android面试题,涵盖内存泄漏与溢出、Binder机制、MVC/MVP/MVVM架构、Handler机制及Context对象等内容,帮助读者深入了解Android开发的核心概念。
16 0
|
9天前
|
存储 安全 Android开发
探索Android开发之旅:从新手到专家的蜕变之路
【10月更文挑战第8天】在这篇文章中,我们将共同踏上一段激动人心的旅程,深入探索Android开发的奥秘。无论你是初涉编程世界的新手,还是渴望提升技能的开发者,这里都有你需要的知识与启示。通过简洁明了的语言和实际案例,我们将一起解锁Android开发的核心概念、掌握关键技能,并最终实现从新手到专家的华丽转变。
|
10天前
|
Android开发
Android开发显示头部Bar的需求解决方案--Android应用实战
Android开发显示头部Bar的需求解决方案--Android应用实战
13 0