一、两个类
@Data
class A {
private String name;
private String sex;
private String hobby;
}
@Data
@AllArgsConstructor
class B{
private String name;
private String sex;
}
二、方法
public static void copyProperties(Object target,Object source){
//取一个对象属性不会赋的值
String judgeResult="f1f6877e-080a-4942-a224-1b7601542414-a241";
BeanWrapper targetBeanWrapper = new BeanWrapperImpl(target);
BeanWrapper sourceBeanWrapper2 = new BeanWrapperImpl(source);
PropertyDescriptor[] targetPropertyDescriptors = targetBeanWrapper.getPropertyDescriptors();
PropertyDescriptor[] sourcePropertyDescriptors2 = sourceBeanWrapper2.getPropertyDescriptors();
Map<String, Object> map = new HashMap<>();
//把目标所有的属性名先存储在map里
for (int i = 0; i < targetPropertyDescriptors.length; i++) {
map.put(targetPropertyDescriptors[i].getName(), judgeResult);
}
map.remove("class");
for (PropertyDescriptor propertyDescriptor : sourcePropertyDescriptors2) {
String name = propertyDescriptor.getName();
//判断来源是否有相同属性名,有则把值映射到相应的属性名
if (judgeResult.equals(map.get(name))) {
map.put(name, sourceBeanWrapper2.getPropertyValue(name));
}
}
for (String key : map.keySet()) {
//不等于则代表此属性名已有相对应的值
if (!judgeResult.equals(map.get(key))) {
targetBeanWrapper.setPropertyValue(key, map.get(key));
}
}
}
三、结果
public static void main(String[] args) {
A target=new A();
B source=new B("John","boy");
copyProperties(target,source);
System.out.println(target);
System.out.println(source);
}