一、“任务”背景
前哨:报告,前方发现一处阻碍,我方连续攻克几分钟一直拿不下来,请上级定夺攻克方案。
指挥室:哦,那先来说说具体情况
前哨:是。
二、“任务”描述
前哨:报告,事情的经过是这样子的!
我们在做一个需求的时候有时会遇到这样的一种情况,需要把两个相同类型的类合并在一起,以其中一个为准,将两个类的值合并到一处,进行返回。那像这种情况或许BeanUtils就不足以满足我们的要求了。
前哨:报告A长,事情的经过如此
指挥室:好,明白了,你先到门口等着,我们马上出方案
前哨:是
指挥室:大家都听到了,有什么好的方案都说出来吧!
两分钟过后。。。
指挥室:哨兵
前哨:到
指挥室:方案出来了,拿着方案赶快去把阻碍解决,把失去的时间抢回来
前哨:是
三、解决方案
private <T> T heBingBean(Object sourceBean, T targetBean) {
if (ObjectUtils.isEmpty(sourceBean) || ObjectUtils.isEmpty(targetBean)) {
return null;
}
// 获取本类中的字段
Field[] sourceFields = sourceBean.getClass().getDeclaredFields();
Field[] targetFields = targetBean.getClass().getDeclaredFields();
try {
for (int i = 0; i < sourceFields.length; i++) {
Field sourceField = sourceFields[i];
Field targetField = targetFields[i];
// 设置访问权限
sourceField.setAccessible(true);
targetField.setAccessible(true);
if (ObjectUtils.isEmpty(sourceField.get(sourceBean)) || StringUtils.equals("serialVersionUID", sourceField.getName())) {
continue;
}
if (Modifier.isStatic(sourceField.getModifiers()) || Modifier.isStatic(targetField.getModifiers())) {
continue;
}
if (ObjectUtils.isEmpty(targetField.get(targetBean))) {
targetField.set(targetBean, sourceField.get(sourceBean));
}
}
} catch (Exception e) {
LOGGER.error("合并Bean属性出错", e);
}
return targetBean;
}
前哨:报告,阻碍得到解决,失去的时间已经抢回来
指挥室:好,结果如何
前哨:结果如下
指挥室:好,不错,但是这里还有一个遗留问题,还有待解决。对于有默认值的情况得考虑一下如何规避掉