package com.xkrs.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 复制源对象的属性值
 * @Author tajochen
 */
public class CopyPropertiesUtil {

    /**
     * 复制源对象和目标对象的属性值
     * @param source 源对象
     * @param target 目标对象
     * @throws SecurityException
     * @throws IllegalArgumentException
     */
    public static void copy(Object source, Object target) {
        //得到对象的Class
        Class sourceClass = source.getClass();
        Class targetClass = target.getClass();
        //得到Class对象的所有属性
        Field[] sourceFields = sourceClass.getDeclaredFields();
        Field[] targetFields = targetClass.getDeclaredFields();

        for(Field sourceField : sourceFields){
            //属性名
            String name = sourceField.getName();
            //属性类型
            Class type = sourceField.getType();
            String methodName = name.substring(0, 1).toUpperCase() + name.substring(1);
            try{
                //得到属性对应get方法
                Method getMethod = sourceClass.getMethod("get" + methodName);
                //执行源对象的get方法得到属性值
                Object value = getMethod.invoke(source);
                //目标对象的属性名
                for(Field targetField : targetFields){
                    String targetName = targetField.getName();
                    if(targetName.equals(name)){
                        //属性对应的set方法
                        Method setMethod = targetClass.getMethod("set" + methodName, type);
                        //执行目标对象的set方法
                        setMethod.invoke(target, value);
                    }
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}
