自定義對象數據替換其字段值

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 數據操作工具類
 * @author xuyang
 * @time 2016/11/10 15:58
 */
public class DataHelper {
    /**
     * 替換對象的字段數據(對象類型必須相同)
     * @param sourceObject 被替換的源數據對象 replaceObject 替換的數據對象
     * @return Object 替換後的數據對象
     * @author xuyang
     * @time 2016/11/10 15:58
     */
    public static <T> T updateObject(T sourceObject,T replaceObject){
        Class<?> sourceClazz = sourceObject.getClass();
        Field[] sourceFields = sourceClazz.getDeclaredFields();

        Class<?> replaceClazz = sourceObject.getClass();
        Field[] replaceFields = replaceClazz.getDeclaredFields();

        try {
            for (int i = 0;i < replaceFields.length;i++){
                Field replaceField = replaceFields[i];
                replaceField.setAccessible(true);
                //字段子更新賦值判斷
                if (null != replaceField.get(replaceObject)) {
                    Field sourceField = sourceFields[i];
                    sourceField.setAccessible(true);
                    sourceField.set(sourceObject,replaceField.get(replaceObject));
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return sourceObject;
    }

    /**
     * 替換對象的字段數據(對象類型可以不同,只替換同類型同字段名的字段值)
     * @param sourceObject 被替換的源數據對象 replaceObject 替換的數據對象
     * @return Object 替換後的數據對象
     * @author xuyang
     * @time 2016/11/10 15:58
     */
    public static <T> T updateDifObject(T sourceObject,Object replaceObject){
        Class<?> sourceClazz = sourceObject.getClass();
        Field[] sourceFields = sourceClazz.getDeclaredFields();

        Class<?> replaceClazz = replaceObject.getClass();
        Field[] replaceFields = replaceClazz.getDeclaredFields();

        try {
            for (int i = 0;i < replaceFields.length;i++){
                Field replaceField = replaceFields[i];
                replaceField.setAccessible(true);
                //字段子更新賦值判斷
                if (null != replaceField.get(replaceObject)) {
                    for (int j = 0; j < sourceFields.length; j++) {
                        Field sourceField = sourceFields[j];
                        if(sourceField.getName().equals(replaceField.getName())
                                && sourceField.getType().getName().equals(replaceField.getType().getName())){
                            sourceField.setAccessible(true);
                            sourceField.set(sourceObject,replaceField.get(replaceObject));
                            break;
                        }
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return sourceObject;
    }


    /**
     * 判斷對象某些值是否爲空
     * @param object
     * @param <T>
     * @return
     * @author gaoliubei
     */
    public static <T> String verify(T object,String[] needVerify)
    {
        Class<?> sourceClazz = object.getClass();
        Field [] fields = sourceClazz.getDeclaredFields();
        StringBuilder result = new StringBuilder();
        boolean isLegal = true;
        for (int i = 0;i < fields.length;i++)
        {
            Field field = fields[i];
            field.setAccessible(true);
            try {
                Object value = field.get(object);
                if (value == null)
                {

                    String filedName = field.getName();
                    boolean isd = false;
                    for (int j = 0;j < needVerify.length; j++)
                    {
                        String isResult = needVerify[j];
                        if (isResult == filedName)
                        {
                            isLegal = false;
                            isd = true;
                            break;
                        }
                    }

                    if (isd)
                    {
                        result.append(filedName+" : 不能爲空 ");
                    }

                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }

        if (!isLegal)
        {
            return result.toString();
        }
        return null;
    }

    /**
     * map轉對象
     * @param map
     * @param beanClass
     * @return
     * @throws Exception
     */
    public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) {
        try {
            if (map == null)
                return null;

            Object obj = beanClass.newInstance();

            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor property : propertyDescriptors) {
                Method setter = property.getWriteMethod();
                if (setter != null) {
                    setter.invoke(obj, map.get(property.getName()));
                }
            }

            return obj;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 對象轉map
     * @param obj
     * @return
     */
    public static Map<?, ?> objectToMap(Object obj) {
        try {
            if(obj == null)
                return null;

            Map<String, Object> map = new HashMap<String, Object>();

            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor property : propertyDescriptors) {
                String key = property.getName();
                if (key.compareToIgnoreCase("class") == 0) {
                    continue;
                }
                Method getter = property.getReadMethod();
                Object value = getter!=null ? getter.invoke(obj) : null;
                map.put(key, value);
            }

            return map;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章