美文网首页Android技术知识Android开发Android开发经验谈
Android 开发中的代码片段(2)复制对象之间的属性值

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

作者: AndroidRookie | 来源:发表于2018-09-09 19:17 被阅读10次

前言

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

最后

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

FullScreenDeveloper

相关文章

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

    前言 开发中会遇到这样的一个情况,我们得到一个dto对象,里面有几十个属性值,需要将这几十个属性值的N个通过VO传...

  • Es6对象的扩展

    属性的简写方法 上面代码中,变量在对象中当做属性名,属性值就是变量的值,这就是属性的简写方式。 函数中的声明的对象...

  • iOS • 记——代理传值和Block传值的简单对比

    在iOS开发中,两个界面之间的传值是开发中经常会用到,给需要传值的对象,直接定义属性就能传值。传值分为两种,顺传和...

  • Object对象

    object 对象 在对象中保存的值称为属性 向对象中添加属性 语法:对象.属性名 = 属性值读取对象中的属性 语...

  • 02.11 对象

    对象字面量 里面是多个属性,属性名和属性值之间用冒号连接,多个属性之间用逗号隔开 注意:1.对象字面量需要保存;2...

  • 深浅复制

    深浅复制和属性为copy,strong值的变化问题 浅复制:只复制指向对象的指针,而不复制引用对象本身。对于浅复制...

  • MJExtension源码解析

    核心代码 获取对象的每一个属性,包括父类的属性,不包括NSObject,代码如下 取出属性值,代码如下 对象类型的...

  • Android 开发中的代码片段(1)

    前言 收集Android开发中常用的一些代码片段,留存记录 代码 禁止截屏 对安全性要求比较高的APP可以用得到 ...

  • js中复制对象的属性值给新的对象

    我们有一个对象,且包含很多属性值和方法,但是我们想把它的内部属性复制给一个新的对象时,我们如何去做呢? 你可能会说...

  • 《第一行代码》阅读笔记2

    Android开发之UI开发 1.属性android:visibility (所有控件中都具有的属性)可选值有三种...

网友评论

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

    本文链接:https://www.haomeiwen.com/subject/wludgftx.html