Class DeepCloner

  • All Implemented Interfaces:
    DeepClonerSPI

    public class DeepCloner
    extends java.lang.Object
    implements DeepClonerSPI
    The purpose of the deep cloner is to create a deep clone of an object. An object can also be cloned to a different class-loader.

    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class Description
      private static class  DeepCloner.UnsafeFieldWriter
      Most of this code has been copied from the Sun14ReflectionProvider in the XStream project.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private java.lang.Class<DoNotClone> doNotClone  
      private java.util.Map<java.lang.Object,​java.lang.Object> referenceMap  
      private java.lang.ClassLoader targetCL  
    • Constructor Summary

      Constructors 
      Constructor Description
      DeepCloner()
      Clone using the current ContextClassLoader.
      DeepCloner​(java.lang.ClassLoader classLoader)
      Clone using the supplied ClassLoader.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      private static void assertObjectNotNull​(java.lang.Object object)  
      <T> T clone​(T objectToClone)
      Clones an object.
      <T> T clone​(T objectToClone, boolean includeStandardJavaType)  
      private java.lang.Object cloneEnum​(java.lang.ClassLoader targetCL, java.lang.Object source)  
      private <T> void cloneFields​(java.lang.ClassLoader targetCL, java.lang.Class<T> targetClass, java.lang.Object source, java.lang.Object target, java.util.Map<java.lang.Object,​java.lang.Object> referenceMap, boolean cloneStandardJavaTypes)  
      private java.lang.Object cloneJavaReflectMethod​(java.lang.Object source)  
      private void close​(java.io.Closeable closeable)  
      private java.lang.Class<DoNotClone> getDoNotClone​(java.lang.ClassLoader targetCL)  
      private static java.lang.Enum getEnumValue​(java.lang.Object enumValueOfSourceClassloader, java.lang.Class<java.lang.Object> enumTypeLoadedByTargetCL)  
      private static <T> java.lang.Class<T> getType​(T object)  
      private java.lang.Object instantiateArray​(java.lang.ClassLoader targetCL, java.lang.Class<?> arrayClass, java.lang.Object objectToClone, boolean cloneStandardJavaTypes)  
      private static boolean isClass​(java.lang.Object object)  
      private static boolean isImpliticlySerializable​(java.lang.Class<?> cls)  
      private static boolean isIterable​(java.lang.Class<?> cls)  
      private static boolean isIterable​(java.lang.Object object)  
      private boolean isJavaReflectClass​(java.lang.Class<?> cls)  
      private boolean isJavaReflectMethod​(java.lang.Class<?> cls)  
      private static boolean isSerializable​(java.lang.Class<?> cls)  
      private <T> boolean isSerializableCandidate​(java.lang.Class<T> targetClass, java.lang.Object source)  
      private static <T> boolean isStandardJavaType​(java.lang.Class<T> targetClass)  
      private static boolean isStaticFinalModifier​(java.lang.reflect.Field field)  
      private boolean isSunClass​(java.lang.Class<?> cls)  
      private <T> T performClone​(java.lang.Class<T> targetClass, java.lang.Object source, boolean shouldCloneStandardJavaTypes)  
      private java.lang.Object serializationClone​(java.lang.Object source)  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • targetCL

        private final java.lang.ClassLoader targetCL
      • referenceMap

        private final java.util.Map<java.lang.Object,​java.lang.Object> referenceMap
      • doNotClone

        private final java.lang.Class<DoNotClone> doNotClone
    • Constructor Detail

      • DeepCloner

        public DeepCloner​(java.lang.ClassLoader classLoader)
        Clone using the supplied ClassLoader.
      • DeepCloner

        public DeepCloner()
        Clone using the current ContextClassLoader.
    • Method Detail

      • getDoNotClone

        private java.lang.Class<DoNotClone> getDoNotClone​(java.lang.ClassLoader targetCL)
      • clone

        public <T> T clone​(T objectToClone)
        Clones an object.
        Specified by:
        clone in interface DeepClonerSPI
        Returns:
        A deep clone of the object to clone.
      • clone

        public <T> T clone​(T objectToClone,
                           boolean includeStandardJavaType)
        Parameters:
        includeStandardJavaType - true also clones standard java types (using simple serialization), false simply reference to these objects (will be same instance).
        Returns:
        A deep clone of the object to clone.
      • getType

        private static <T> java.lang.Class<T> getType​(T object)
      • isClass

        private static boolean isClass​(java.lang.Object object)
      • assertObjectNotNull

        private static void assertObjectNotNull​(java.lang.Object object)
      • performClone

        private <T> T performClone​(java.lang.Class<T> targetClass,
                                   java.lang.Object source,
                                   boolean shouldCloneStandardJavaTypes)
      • cloneJavaReflectMethod

        private java.lang.Object cloneJavaReflectMethod​(java.lang.Object source)
      • isJavaReflectMethod

        private boolean isJavaReflectMethod​(java.lang.Class<?> cls)
      • isSunClass

        private boolean isSunClass​(java.lang.Class<?> cls)
      • isJavaReflectClass

        private boolean isJavaReflectClass​(java.lang.Class<?> cls)
      • isSerializableCandidate

        private <T> boolean isSerializableCandidate​(java.lang.Class<T> targetClass,
                                                    java.lang.Object source)
      • isImpliticlySerializable

        private static boolean isImpliticlySerializable​(java.lang.Class<?> cls)
      • isSerializable

        private static boolean isSerializable​(java.lang.Class<?> cls)
      • serializationClone

        private java.lang.Object serializationClone​(java.lang.Object source)
      • close

        private void close​(java.io.Closeable closeable)
      • cloneEnum

        private java.lang.Object cloneEnum​(java.lang.ClassLoader targetCL,
                                           java.lang.Object source)
      • cloneFields

        private <T> void cloneFields​(java.lang.ClassLoader targetCL,
                                     java.lang.Class<T> targetClass,
                                     java.lang.Object source,
                                     java.lang.Object target,
                                     java.util.Map<java.lang.Object,​java.lang.Object> referenceMap,
                                     boolean cloneStandardJavaTypes)
      • isStandardJavaType

        private static <T> boolean isStandardJavaType​(java.lang.Class<T> targetClass)
      • isStaticFinalModifier

        private static boolean isStaticFinalModifier​(java.lang.reflect.Field field)
      • isIterable

        private static boolean isIterable​(java.lang.Object object)
      • isIterable

        private static boolean isIterable​(java.lang.Class<?> cls)
      • getEnumValue

        private static java.lang.Enum getEnumValue​(java.lang.Object enumValueOfSourceClassloader,
                                                   java.lang.Class<java.lang.Object> enumTypeLoadedByTargetCL)
      • instantiateArray

        private java.lang.Object instantiateArray​(java.lang.ClassLoader targetCL,
                                                  java.lang.Class<?> arrayClass,
                                                  java.lang.Object objectToClone,
                                                  boolean cloneStandardJavaTypes)