利用反射合并对象

这篇博客介绍了如何使用Java实现一个工具类,用于处理两个对象之间的属性复制和赋值,特别是在保存更新实体时,保留未改变的原有值。文章通过一个具体的例子展示了如何利用反射来获取和设置对象字段,并实现了自动填充值的功能。
摘要由CSDN通过智能技术生成
思路:
前端传入对象时,需要修改数据库种的对象。
有些数据需要保留。geng'ju


USER 对象
            A实列                       B实列
id         1                            1
name       张三                         李四
age        16                           15
sex        null        <--              男
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import lombok.Data;
/**
 *@program: sacp
 *@description:
 *@author: ZiWei.Tan
 *@create: 2021-08-13 09:37
 * TODO 在save 的时候实体类需要赋值。有些存在需要赋值给前端传入的新实体种。原来的值没有发生改变的需要保留
 */
public class ClassUtil {


  /**
   * 处理对象相同属性赋值
   * 					USER 对象
   * 		    A实列   					 B实列
   * id		  1							    1
   * name	  张三		  				李四
   * age		16			  				15
   * sex		null		<--				男
   * @param source A 对象
   * @param target B 对象
   * @return A 对象
   * Automatic value filling
   */
  public static <T> T autoValueFilling(T source, T target) {
    try {
      Class<T> clazz = (Class<T>) source.getClass();
      //获取所有的bean中所有的成员变量
      Field[] fields = clazz.getDeclaredFields();
      for (int j = 0; j < fields.length; j++) {
        //获取所有的bean中变量类型为String的变量
        Field field = fields[j];
        if (!Modifier.isFinal(field.getModifiers())) {
          //获取 source 的值
          Object methodValue = getValue(source, field);
          //判断值是否为空或者为null
          if (methodValue == null) {
            // 获取target 相同数据的值
            Object targetValue = getValue(target, getAttribute(field));
            if (targetValue != null) {
              // 设置 source 的值
              setValue(source, field, targetValue);
            }
          }

        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    return source;
  }

  /**
   * 获取get方法
   * @param field
   * @return
   */
  public static String getAttribute(Field field) {
    return "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().replaceFirst("\\w", "");
  }

  /**
   *
   * @param source
   * @param field
   * @param <T>
   * @return
   */
  public static <T> Object getValue(T source, Field field) {
    String methodName = getAttribute(field);
    return getValue(source, methodName);
  }

  /**
   *
   * @param source
   * @param methodName
   * @param <T>
   * @return
   */
  public static <T> Object getValue(T source, String methodName) {
    try {
      Class<T> clazz = (Class<T>) source.getClass();
      Method getMethod = clazz.getDeclaredMethod(methodName);
      //打破封装
      getMethod.setAccessible(true);
      //得到该方法的值
      return getMethod.invoke(source);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }




  /**
   * 获取set方法
   * @param field
   * @return
   */
  public static String setAttribute(Field field) {
    return "set" + field.getName().substring(0, 1).toUpperCase() + field.getName().replaceFirst("\\w", "");
  }

  /**
   * 设置 set 值
   * @param source 源Class
   * @param field 属性
   * @param methodValue 设置得值
   * @param <T>
   * @return
   */
  public static <T> Object setValue(T source, Field field, Object methodValue) {
    try {
      Class<T> clazz = (Class<T>) source.getClass();
      //得到get方法的Method对象,带参数
      String setMethodName = setAttribute(field);
      Method setMethod = clazz.getDeclaredMethod(setMethodName, field.getType());
      setMethod.setAccessible(true);
      //赋值
      setMethod.invoke(source, methodValue);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }



  public static void main(String[] args) {
    UserTest user = new UserTest();
    user.setId(51L);
    user.setName("ZiWei.Tan");

    UserTest user1 = new UserTest();
    user1.setId(51L);
    user1.setName("TTTT");
    user1.setAge(16L);

    UserTest test = autoValueFilling(user, user1);
    System.out.println(test);
  }
}



@Data
class UserTest {

  private static final String TEST = "test";
  private Long id;
  private String name;
  private Long age;
  private Long sex;


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值