不建议用BeanUtils.copyProperties

368 阅读1分钟

1:属性类型不一致导致拷贝失败

2:null值覆盖导致数据异常

  拷贝数据的null值覆盖拷贝目标数据的字段,导致原有的数据失效。

3:BeanUtils.copyProperties是浅拷贝

拷贝后修改了原始对象的引用类型的数据,就会导致拷贝数据的值发生异常。

4:底层实现为反射拷贝效率低

public class BeanUtilsTest {

    public static void main(String[] args) {
        long copyStartTime = System.currentTimeMillis();
        User sourceUser = new User("sunyangwei");
        User targetUser = new User();
        for(int i = 0; i < 10000; i++) {
            BeanUtils.copyProperties(sourceUser, targetUser);
        }
        System.out.println("copy方式:"+(System.currentTimeMillis()-copyStartTime));

        long setStartTime = System.currentTimeMillis();
        for(int i = 0; i < 10000; i++) {
            targetUser.setUserName(sourceUser.getUserName());
        }
        System.out.println("set方式:"+(System.currentTimeMillis()-setStartTime));
    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class User{
    private String userName;
}

image.png

建议解决方案

方式一:使用apache的beanutil 类型不匹配时会抛异常,属性覆盖问题需要自己逐一处理。

方式二:使用插件:beanConvert

image.png