实体对象相互转换数据
最近参与开发的项目,一堆相同类型的实体,只是里面的元素不同,其中涉及到相互转换数据的问题,比如我们定义的是domain实体,这是完整的,那么在进行数据交互的时候,却是用的DTO,VO类型的实体,这两个类型也就是比domain少几个属性,却是需要domain转换为DTO再和前端交互数据,比较麻烦,就写了两个方法进行处理,在此进行记录。
第一种方式需要转换类型:
/**
* 复制属性,会进行类型转换,效率较低
*
* @param source 源对象 bean map
* @param target 目标对象 bean map
*/
public static void copyProperties(Object source, Object target) {
if (source == null || target == null) {
return;
}
if (target instanceof Map) {
if (source instanceof Map) {
((Map) target).putAll((Map) source);
} else {
Class sourceClass = source.getClass();
PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(sourceClass);
for (PropertyDescriptor descriptor : descriptors) {
try {
((Map) target).put(descriptor.getName(), descriptor.getReadMethod().invoke(source));
} catch (InvocationTargetException | IllegalAccessException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}
} else {
Class targetClass = target.getClass();
PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(targetClass);
if (source instanceof Map) {
for (PropertyDescriptor descriptor : descriptors) {
try {
descriptor.getWriteMethod().invoke(target,
ConvertUtils.convert(((Map) source).get(descriptor.getName()), descriptor.getPropertyType()));
} catch (InvocationTargetException | IllegalAccessException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
} else {
Class sourceClass = source.getClass();
PropertyDescriptor[] sourceDescriptors = PropertyUtils.getPropertyDescriptors(sourceClass);
Map<String, Method> methodMap = new HashMap<>(sourceDescriptors.length * 2);
for (PropertyDescriptor descriptor : sourceDescriptors) {
methodMap.put(descriptor.getName(), descriptor.getReadMethod());
}
for (PropertyDescriptor descriptor : descriptors) {
Method method = methodMap.get(descriptor.getName());
if (method != null && (!"getClass".equals(method.getName()))) {
try {
descriptor.getWriteMethod().invoke(target,
ConvertUtils.convert(method.invoke(source), descriptor.getPropertyType()));
} catch (InvocationTargetException | IllegalAccessException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}
}
}
}
第二种方式同源转换,类型一致:
/**
* 复制属性,只复制相同属性值,不进行类型转换效率较高
*
* @param source 源对象 bean map
* @param target 目标对象 bean map
*/
public static void copySameProperties(Object source, Object target) {
if (source == null || target == null) {
return;
}
if (target instanceof Map) {
copyProperties(source, target);
} else {
Class targetClass = target.getClass();
PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(targetClass);
if (source instanceof Map) {
for (PropertyDescriptor descriptor : descriptors) {
Object val = ((Map) source).get(descriptor.getName());
if (val != null && val.getClass().equals(descriptor.getPropertyType())) {
try {
descriptor.getWriteMethod().invoke(target, val);
} catch (InvocationTargetException | IllegalAccessException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}
} else {
Class sourceClass = source.getClass();
PropertyDescriptor[] sourceDescriptors = PropertyUtils.getPropertyDescriptors(sourceClass);
Map<String, PropertyDescriptor> descriptorMap = new HashMap<>(sourceDescriptors.length * 2);
for (PropertyDescriptor descriptor : sourceDescriptors) {
descriptorMap.put(descriptor.getName(), descriptor);
}
for (PropertyDescriptor descriptor : descriptors) {
PropertyDescriptor pd = descriptorMap.get(descriptor.getName());
if (pd != null && pd.getPropertyType().equals(descriptor.getPropertyType())) {
try {
Method method = descriptor.getWriteMethod();
if (method != null && !"getClass".equals(method.getName())){
method.invoke(target, pd.getReadMethod().invoke(source));
}
} catch (InvocationTargetException | IllegalAccessException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/75123.html