2017-06-18 5 views
0

J'ai copié un objet dans un autre avec l'aide deSource se modiefied quand je modifie l'objet cible de BeanUtils.CopyProperties

BeanUtils.CopyProperties(Src,Dest); 

From : package org.springframework.beans; 

Maintenant, plus loin dans la logique, avec l'aide de iterator je modifie la liste à l'intérieur objet Dest.

Je souhaite que l'objet src soit tel quel.

Mais je vois un comportement étrange. Mon Src est également modifié.

Quelle peut être la raison?

Exemple: src et dest ont la liste: [Mango, Apple]

Je retiré de Mango Dest avec l'aide de iteartor.

plus tard, je vois
Src ont [Apple]
Dest ont [Apple]

Est-ce que cela se produise en raison de copie superficielle?

+0

"plus tard, je vois Src ont [Mango] Dest ont [Apple]" On dirait « plus tard, je vois Src ont [Apple] Dest ont [Apple] "? – davidxxx

+0

oui monsieur je vois [Apple] à droite – VedX

Répondre

2

Vous ne voulez pas copier le champ List mais le cloner dans le nouvel objet copié.

BeanUtils.copyProperties(Object source, Object target)BeanUtils.copyProperties(Object source, Object target) n'est pas explicite clairement dans son javadoc mais il fait une copie superficielle d'un objet à un autre.

Cela signifie que, dans l'objet target, le champ List fera référence au même objet que celui qui dans l'objet source.

modifiant donc le champ List de l'un ou l'autre objet sera reflété dans l'autre.

Pour créer une nouvelle liste, vous devez créer une nouvelle instance de la liste qui contient les éléments réels dans la source List et l'affecter au champ List dans l'objet cible.

Par exemple:

MyObject source = ...; 
MyObject target = ...; 

BeanUtils.copyProperties(source, target); 
... 
List<String> newList = new ArrayList<>(source.getList()); 
target.setList(newList); 
+0

merci @ davidxxx J'ai compris qu'il doit être en raison de la copie superficielle, connaissez-vous une méthode de copie profonde? – VedX

+0

Vous êtes les bienvenus :) Vous pouvez le faire manuellement avec un constructeur ArrayList comme dans mon exemple. J'étais en train d'éditer. – davidxxx

+0

ou suggérez-vous la méthode faite sur commande? comme ci-dessus? – VedX