Java利用反射性质实现两个相似的类属性赋值

380 阅读1分钟

实际开发中我们经常会遇到Form表单和我们的Model实体类有很多字段重合,又不想每天忙于写if,else判断值是否存在,于是写了个偷懒版本,开箱即用。



import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
/**
 * 遍历对象属性值(利用反射实现),可以在需要对 对象中的每个字段都执行相同的处理时使用
 *
 * @author Tan
 */
public class DisposeUtil
{
   /**
    *  @param object 需要给其他类赋值的对象
    *  @param clazz target类Class
    */
    public static Object dispose(Object object, Class<?> clazz)
    {
        try
        {
            // 等价于 new操作
            Object target = clazz.newInstance();
            // 获取实体类的所有属性,返回Field数组
            Field[] field = object.getClass().getDeclaredFields();
            // 遍历所有属性
            for (Field item : field)
            {   // 获取属性名
                String name = item.getName();
                // 驼峰转换 方便构建get set方法
                name = name.substring(0, 1).toUpperCase() + name.substring(1);
                // 获取属性的类型
                String type = item.getGenericType().toString();
               // 获取get方法
                Method m = object.getClass().getMethod("get" + name);
                 // 判断类型,使用包装类,属性名带有class 开头
                if ("class java.lang.String".equals(type))
                {
                    // 调用getter方法获取属性值
                    String value = (String) m.invoke(object);
                    m = target.getClass().getMethod("set" + name, String.class);
                    m.invoke(target, value);
                }
                else if ("class java.lang.Integer".equals(type))
                {
                    Integer value = (Integer) m.invoke(object);
                    if (value != null)
                    {
                        m = target.getClass().getMethod("set" + name, Integer.class);
                        m.invoke(target, value);
                    }
                }
                else if ("class java.lang.Long".equals(type))
                {
                    Long value = (Long) m.invoke(object);
                    if (value != null)
                    {
                        m = target.getClass().getMethod("set" + name, Long.class);
                        m.invoke(target, value);
                    }
                }
                else if ("class java.lang.Boolean".equals(type))
                {
                    Boolean value = (Boolean) m.invoke(object);
                    if (value != null)
                    {
                        m = target.getClass().getMethod("set" + name, Boolean.class);
                        m.invoke(target, value);
                    }
                }
                else if ("class java.util.Date".equals(type))
                {
                    Date value = (Date) m.invoke(object);
                    if (value != null)
                    {
                        m = target.getClass().getMethod("set" + name, Date.class);
                        m.invoke(target, value);
                    }
                }
                // 如果有需要,可以仿照上面继续进行扩充,再增加对其它类型的判断
            }
            return target;
        }
        // 这里偷懒了一下统一处理了,建议有条件分段处理
        catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException |
                InstantiationException e)
        {
            e.printStackTrace();
        }
        return null;
    }
}