思路:
前端传入对象时,需要修改数据库种的对象。
有些数据需要保留。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;
}