Package org.powermock.classloading
Class DeepCloner
- java.lang.Object
-
- org.powermock.classloading.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 classDeepCloner.UnsafeFieldWriterMost 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>doNotCloneprivate java.util.Map<java.lang.Object,java.lang.Object>referenceMapprivate java.lang.ClassLoadertargetCL
-
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 voidassertObjectNotNull(java.lang.Object object)<T> Tclone(T objectToClone)Clones an object.<T> Tclone(T objectToClone, boolean includeStandardJavaType)private java.lang.ObjectcloneEnum(java.lang.ClassLoader targetCL, java.lang.Object source)private <T> voidcloneFields(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.ObjectcloneJavaReflectMethod(java.lang.Object source)private voidclose(java.io.Closeable closeable)private java.lang.Class<DoNotClone>getDoNotClone(java.lang.ClassLoader targetCL)private static java.lang.EnumgetEnumValue(java.lang.Object enumValueOfSourceClassloader, java.lang.Class<java.lang.Object> enumTypeLoadedByTargetCL)private static <T> java.lang.Class<T>getType(T object)private java.lang.ObjectinstantiateArray(java.lang.ClassLoader targetCL, java.lang.Class<?> arrayClass, java.lang.Object objectToClone, boolean cloneStandardJavaTypes)private static booleanisClass(java.lang.Object object)private static booleanisImpliticlySerializable(java.lang.Class<?> cls)private static booleanisIterable(java.lang.Class<?> cls)private static booleanisIterable(java.lang.Object object)private booleanisJavaReflectClass(java.lang.Class<?> cls)private booleanisJavaReflectMethod(java.lang.Class<?> cls)private static booleanisSerializable(java.lang.Class<?> cls)private <T> booleanisSerializableCandidate(java.lang.Class<T> targetClass, java.lang.Object source)private static <T> booleanisStandardJavaType(java.lang.Class<T> targetClass)private static booleanisStaticFinalModifier(java.lang.reflect.Field field)private booleanisSunClass(java.lang.Class<?> cls)private <T> TperformClone(java.lang.Class<T> targetClass, java.lang.Object source, boolean shouldCloneStandardJavaTypes)private java.lang.ObjectserializationClone(java.lang.Object source)
-
-
-
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
-
-
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:
clonein interfaceDeepClonerSPI- Returns:
- A deep clone of the object to clone.
-
clone
public <T> T clone(T objectToClone, boolean includeStandardJavaType)- Parameters:
includeStandardJavaType-truealso clones standard java types (using simple serialization),falsesimply 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)
-
-