版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36666651/article/details/81241278
java通过反射可以获取到类的所有信息,由此我们可以进行很多操作。
下面是通过java反射完成两个不同对象之间的字段值拷贝的示例:
首先,通过反射获取所有的字段(包含父类),然后进行字段的赋值
/**
* 复制字段的值
* @param source 源对象
* @param target 目标对象
* @param skipFieldNames 过滤的字段
*/
public static void copyFields(Object source, Object target, String[] skipFieldNames){
Set<String> skips = new HashSet<>();
if (skipFieldNames != null){
skips.addAll(Arrays.asList(skipFieldNames));
}
HashMap<String, Field> sourceFieldMap = getAllFields(source);
HashMap<String, Field> targetFieldMap = getAllFields(target);
sourceFieldMap.forEach((key, value) -> {
value.setAccessible(true);
try {
if (value.get(source) != null && !skips.contains(key) && targetFieldMap.containsKey(key)){
targetFieldMap.get(key).setAccessible(true);
targetFieldMap.get(key).set(target, value.get(source));
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
});
}
/**
* 获取对象所有的字段 包括父类
* @param obj 对象
* @return 字段名与Field对象的映射map
*/
private static HashMap<String, Field> getAllFields(Object obj){
Class sourceClass = obj.getClass();
//获取对象所有字段 包括父类
ArrayList<Field> sourceFields = new ArrayList<>();
while (sourceClass != null){
sourceFields.addAll(Arrays.asList(sourceClass.getDeclaredFields()));
sourceClass = sourceClass.getSuperclass();
}
//字段名去重
HashMap<String, Field> sourceFieldMap = new HashMap<>(16);
for (Field field : sourceFields){
sourceFieldMap.put(field.getName(), field);
}
return sourceFieldMap;
}
下面是使用Gson进行对象之间的属性拷贝:
GsonUtil类见这里写链接内容
/**
* 将对象值赋值给目标对象
* @param source 源对象
* @param <T> 目标对象类型
* @return 目标对象实例
*/
public static <T> T convert(Object source, Class<T> clz){
String json = GsonUtil.toJsonFilterNullField(source);
return GsonUtil.fromJson(json, clz);
}