Copying JavaBeans Instances: Difference between revisions
Line 14: | Line 14: | ||
This method can be used when we have access to the JavaBeans instance class code. | This method can be used when we have access to the JavaBeans instance class code. | ||
{{External|[https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html#clone() Javadoc Object.clone()]}} | |||
Essentially, | |||
/** | |||
* Creates and returns a copy of this object. The precise meaning | |||
* of "copy" may depend on the class of the object. The general | |||
* intent is that, for any object {@code x}, the expression: | |||
* <blockquote> | |||
* <pre> | |||
* x.clone() != x</pre></blockquote> | |||
* will be true, and that the expression: | |||
* <blockquote> | |||
* <pre> | |||
* x.clone().getClass() == x.getClass()</pre></blockquote> | |||
* will be {@code true}, but these are not absolute requirements. | |||
* While it is typically the case that: | |||
* <blockquote> | |||
* <pre> | |||
* x.clone().equals(x)</pre></blockquote> | |||
* will be {@code true}, this is not an absolute requirement. | |||
* <p> | |||
* By convention, the returned object should be obtained by calling | |||
* {@code super.clone}. If a class and all of its superclasses (except | |||
* {@code Object}) obey this convention, it will be the case that | |||
* {@code x.clone().getClass() == x.getClass()}. | |||
* <p> | |||
* By convention, the object returned by this method should be independent | |||
* of this object (which is being cloned). To achieve this independence, | |||
* it may be necessary to modify one or more fields of the object returned | |||
* by {@code super.clone} before returning it. Typically, this means | |||
* copying any mutable objects that comprise the internal "deep structure" | |||
* of the object being cloned and replacing the references to these | |||
* objects with references to the copies. If a class contains only | |||
* primitive fields or references to immutable objects, then it is usually | |||
* the case that no fields in the object returned by {@code super.clone} | |||
* need to be modified. | |||
* <p> | |||
* The method {@code clone} for class {@code Object} performs a | |||
* specific cloning operation. First, if the class of this object does | |||
* not implement the interface {@code Cloneable}, then a | |||
* {@code CloneNotSupportedException} is thrown. Note that all arrays | |||
* are considered to implement the interface {@code Cloneable} and that | |||
* the return type of the {@code clone} method of an array type {@code T[]} | |||
* is {@code T[]} where T is any reference or primitive type. | |||
* Otherwise, this method creates a new instance of the class of this | |||
* object and initializes all its fields with exactly the contents of | |||
* the corresponding fields of this object, as if by assignment; the | |||
* contents of the fields are not themselves cloned. Thus, this method | |||
* performs a "shallow copy" of this object, not a "deep copy" operation. | |||
* <p> | |||
* The class {@code Object} does not itself implement the interface | |||
* {@code Cloneable}, so calling the {@code clone} method on an object | |||
* whose class is {@code Object} will result in throwing an | |||
* exception at run time. | |||
* | |||
* @return a clone of this instance. | |||
* @throws CloneNotSupportedException if the object's class does not | |||
* support the {@code Cloneable} interface. Subclasses | |||
* that override the {@code clone} method can also | |||
* throw this exception to indicate that an instance cannot | |||
* be cloned. | |||
* @see java.lang.Cloneable | |||
*/ | |||
=BeanUtils= | =BeanUtils= | ||
<tt>org.apache.commons.beanutils.BeanUtils</tt> is a utility method for populating JavaBeans properties via reflection. This method can be used even if we don't have access to the JavaBeans instance class code. | <tt>org.apache.commons.beanutils.BeanUtils</tt> is a utility method for populating JavaBeans properties via reflection. This method can be used even if we don't have access to the JavaBeans instance class code. |
Revision as of 19:49, 15 October 2018
External
Internal
Overview
This article describes methods of copying Java Bean instances in such a way that changing the copy leaves the original object intact.
Object.clone()
This method can be used when we have access to the JavaBeans instance class code.
Essentially,
/** * Creates and returns a copy of this object. The precise meaning * of "copy" may depend on the class of the object. The general * intent is that, for any object {@code x}, the expression:
*
*
* x.clone() != x
* will be true, and that the expression:
*
*
* x.clone().getClass() == x.getClass()
* will be {@code true}, but these are not absolute requirements. * While it is typically the case that:
*
*
* x.clone().equals(x)
* will be {@code true}, this is not an absolute requirement.
*
* By convention, the returned object should be obtained by calling * {@code super.clone}. If a class and all of its superclasses (except * {@code Object}) obey this convention, it will be the case that * {@code x.clone().getClass() == x.getClass()}. *
* By convention, the object returned by this method should be independent * of this object (which is being cloned). To achieve this independence, * it may be necessary to modify one or more fields of the object returned * by {@code super.clone} before returning it. Typically, this means * copying any mutable objects that comprise the internal "deep structure" * of the object being cloned and replacing the references to these * objects with references to the copies. If a class contains only * primitive fields or references to immutable objects, then it is usually * the case that no fields in the object returned by {@code super.clone} * need to be modified. *
* The method {@code clone} for class {@code Object} performs a * specific cloning operation. First, if the class of this object does * not implement the interface {@code Cloneable}, then a * {@code CloneNotSupportedException} is thrown. Note that all arrays * are considered to implement the interface {@code Cloneable} and that * the return type of the {@code clone} method of an array type {@code T[]} * is {@code T[]} where T is any reference or primitive type. * Otherwise, this method creates a new instance of the class of this * object and initializes all its fields with exactly the contents of * the corresponding fields of this object, as if by assignment; the * contents of the fields are not themselves cloned. Thus, this method * performs a "shallow copy" of this object, not a "deep copy" operation. *
* The class {@code Object} does not itself implement the interface * {@code Cloneable}, so calling the {@code clone} method on an object * whose class is {@code Object} will result in throwing an * exception at run time. * * @return a clone of this instance. * @throws CloneNotSupportedException if the object's class does not * support the {@code Cloneable} interface. Subclasses * that override the {@code clone} method can also * throw this exception to indicate that an instance cannot * be cloned. * @see java.lang.Cloneable */
BeanUtils
org.apache.commons.beanutils.BeanUtils is a utility method for populating JavaBeans properties via reflection. This method can be used even if we don't have access to the JavaBeans instance class code.