為啥不建議用BeanUtils.copyProperties複製資料
來源:京東雲開發者
1:屬性型別不一致導致複製失敗
public class BeanUtilsTest {
public static void main(String[] args) {
SourcePoJo sourcePoJo = new SourcePoJo("jingdong", (long) 35711);
TargetPoJo targetPoJo = new TargetPoJo();
BeanUtils.copyProperties(sourcePoJo,targetPoJo);
System.out.println(targetPoJo);
}
}
@Data
@AllArgsConstructor
class SourcePoJo{
private String username;
private Long id;
}
@Data
class TargetPoJo{
private String username;
private String id;
}
public class BeanUtilsTest {
public static void main(String[] args) {
SourcePoJo sourcePoJo = new SourcePoJo();
sourcePoJo.setUsername("joy");
TargetPoJo targetPoJo = new TargetPoJo();
BeanUtils.copyProperties(sourcePoJo,targetPoJo);
System.out.println(targetPoJo);
}
}
@Data
class SourcePoJo{
private String username;
private Long id;
}
@Data
class TargetPoJo{
private String username;
private long id;
}
2:null值覆蓋導致資料異常
public class BeanUtilsTest {
public static void main(String[] args) {
SourcePoJo sourcePoJo = new SourcePoJo();
sourcePoJo.setId("35711");
TargetPoJo targetPoJo = new TargetPoJo();
targetPoJo.setUsername("Joy");
BeanUtils.copyProperties(sourcePoJo,targetPoJo);
System.out.println(targetPoJo);
}
}
@Data
class SourcePoJo{
private String username;
private String id;
}
@Data
class TargetPoJo{
private String username;
private String id;
}
3:導包錯誤導致複製資料異常
//org.springframework.beans.BeanUtils(源物件在左邊,目標物件在右邊)public static void copyProperties(Object source, Object target) throws BeansException //org.apache.commons.beanutils.BeanUtils(源物件在右邊,目標物件在左邊)public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException
4:查詢不到欄位引用,修改內容難以溯源
5:內部類資料無法成功複製
public class BeanUtilsTest {
public static void main(String[] args) {
SourcePoJo sourcePoJo = new SourcePoJo();
sourcePoJo.setUsername("joy");
SourcePoJo.InnerClass innerClass = new SourcePoJo.InnerClass("sourceInner");
sourcePoJo.innerClass=innerClass;
System.out.println(sourcePoJo.toString());
TargetPoJo targetPoJo = new TargetPoJo();
BeanUtils.copyProperties(sourcePoJo,targetPoJo);
System.out.println(targetPoJo.toString());
}
}
//下面是類的資訊,這裡就直接放到一塊展示了
@Data
@ToString
public class SourcePoJo{
private String username;
private Long id;
public InnerClass innerClass;
@Data
@ToString
@AllArgsConstructor
public static class InnerClass{
public String innerName;
}
}
@Data
@ToString
public class TargetPoJo{
private String username;
private Long id;
public InnerClass innerClass;
@Data
@ToString
public static class InnerClass{
public String innerName;
}
}
6:BeanUtils.copyProperties是淺複製
public class BeanUtilsTest {
public static void main(String[] args) {
Person sourcePerson = new Person("sunyangwei",new Card("123456"));
Person targetPerson = new Person();
BeanUtils.copyProperties(sourcePerson, targetPerson);
sourcePerson.getCard().setNum("35711");
System.out.println(targetPerson);
}
}
class Card {
private String num;
}
class Person {
private String name;
private Card card;
}
7:底層實現為反射複製效率低
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));
}
}
class User{
private String userName;
}
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024420/viewspace-3001861/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 終於知道為啥網頁不讓我複製貼上了!網頁
- 為什麼不建議你用 MongoDB 這類產品替代時序資料庫?MongoDB資料庫
- C++再議建構函式及複製建構函式深度複製C++函式
- Spring官方都推薦使用的@Transactional事務,為啥我不建議使用!Spring
- 為什麼不建議把資料庫部署在docker容器內?資料庫Docker
- 為什麼不建議使用gotoGo
- 為什麼判斷物件是否相等, 不建議用 equals ?物件
- maven 打包不複製資源Maven
- 為什麼不建議使用eval和with?
- 批次複製資料夾而不復制內容
- 不建議開發來做資料庫選型資料庫
- DM7資料複製之資料庫級複製資料庫
- 資料共享(淺複製)與資料獨立(深複製)
- 資料庫複製(一)–複製介紹資料庫
- 資料複製_Stream
- 資料庫複製資料庫
- 複製資料庫資料庫
- 用TC來實現只複製資料夾而不復制資料夾中的內容
- 非同步流複製模式如何保證不丟資料?非同步模式
- Day 7.5 資料型別總結 + 複製 淺複製 深複製資料型別
- 為什麼 Android 中不建議使用 EnumsAndroid
- 主從複製是啥或者主從複製的原理是什麼?
- 資料庫為何不建議部署在Docker容器內資料庫Docker
- Redis的資料複製Redis
- MySQL複製資料表MySql
- 資料複製_GoldenGateGo
- DM7資料複製之模式級複製模式
- 為什麼MOBA、“吃雞”遊戲不推薦用tcp協議——實測資料遊戲TCP協議
- 為什麼不建議使用免費的IP代理?
- 為什麼不建議函式有太多引數?函式
- 跨DB主機抓取資料建議用MATERIALIZED VIEWZedView
- 資料庫同步你們用啥資料庫
- 為什麼不建議使用自定義Object作為HashMap的key?ObjectHashMap
- Java面試題:為什麼HashMap不建議使用物件作為Key?Java面試題HashMap物件
- 資料庫主從複製資料庫
- 資料複製策略綜述
- Oracle活動資料庫複製Oracle資料庫
- 資料備份與複製