java經過反射拷貝兩個對象的同名同類型變量

深拷貝和淺拷貝

首先對象的複製分爲深拷貝和淺拷貝,關於這二者的區別,簡單來講就是對於對象的引用,在拷貝的時候,是否會新開闢一塊內存,仍是直接複製引用。
二者的比較也有不少,具體能夠看這篇文章: http://blog.csdn.net/zhangjg_blog/article/details/18369201html

經常使用方法

這些只是目前我知道了,固然可能還有更多java

  1. org.apache.commons.lang3.SerializationUtils#clone
    這個是經過序列化的方式,將兩個相同類型的對象進行拷貝。 這裏是深拷貝spring

  2. org.apache.commons.beanutils.BeanUtils#copyProperties
  3. org.apache.commons.beanutils.PropertyUtils#copyProperties
  4. org.springframework.beans.BeanUtils#copyProperties數據庫

關於這些的效率問題,能夠看這篇文章: http://www.cnblogs.com/kaka/archive/2013/03/06/2945514.htmlapache

本文

這裏要說的是關於兩個對象,將對象1的同類型同變量名的變量賦值到對象2上。.net

關於爲何要作這件事情

遇到了一個特別傻逼的事情,從數據庫裏面讀表,而後一個接口是DO1,一個接口是DO2, 兩個DO中的變量名基本相同,而後須要統一兩個DO,也就是將DO1中的同名變量的值賦給DO2。code

思路

這邊是用的淺拷貝,思路其實很簡單:htm

  1. 經過反射獲取DO1中的全部變量
  2. 遍歷DO1中的變量,判斷在DO2中是否存在
  3. 若是存在,並且是相同類型,則進行賦值

代碼

public static void copyByName(Object src, Object target) {
        if (src == null || target == null) {
            return;
        }
        try {
            Map<String, Field> srcFieldMap= getAssignableFieldsMap(src);
            Map<String, Field> targetFieldMap = getAssignableFieldsMap(target);
            for (String srcFieldName : srcFieldMap.keySet()) {
                Field srcField = srcFieldMap.get(srcFieldName);
                if (srcField == null) {
                    continue;
                }
                // 變量名須要相同
                if (!targetFieldMap.keySet().contains(srcFieldName)) {
                    continue;
                }
                Field targetField = targetFieldMap.get(srcFieldName);
                if (targetField == null) {
                    continue;
                }
                // 類型須要相同
                if (!srcField.getType().equals(targetField.getType())) {
                    continue;
                }

                targetField.set(target,srcField.get(src));
            }
        }catch (Exception e) {
            // 異常
        }
        return ;
    }

    private static Map<String, Field> getAssignableFieldsMap(Object obj) {
        if (obj == null) {
            return new HashMap<String, Field>();
        }
        Map<String, Field> fieldMap = new HashMap<String, Field>();
        for (Field field : obj.getClass().getDeclaredFields()) {
            // 過濾不須要拷貝的屬性
            if (Modifier.isStatic(field.getModifiers()) 
                 || Modifier.isFinal(field.getModifiers())) {
                continue;
            }
            field.setAccessible(true);
            fieldMap.put(field.getName(), field);
        }
        return fieldMap;
    }
相關文章
相關標籤/搜索