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 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)
-
-
-
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:
clone
in interfaceDeepClonerSPI
- 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)
-
-