public class DeepCloner extends java.lang.Object implements DeepClonerSPI
Modifier and Type | Class and Description |
---|---|
private static class |
DeepCloner.UnsafeFieldWriter
Most of this code has been copied from the Sun14ReflectionProvider in the
XStream project.
|
Modifier and Type | Field and Description |
---|---|
private java.lang.Class<DoNotClone> |
doNotClone |
private java.util.Map<java.lang.Object,java.lang.Object> |
referenceMap |
private java.lang.ClassLoader |
targetCL |
Constructor and Description |
---|
DeepCloner()
Clone using the current ContextClassLoader.
|
DeepCloner(java.lang.ClassLoader classLoader)
Clone using the supplied ClassLoader.
|
Modifier and Type | Method and 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) |
private final java.lang.ClassLoader targetCL
private final java.util.Map<java.lang.Object,java.lang.Object> referenceMap
private final java.lang.Class<DoNotClone> doNotClone
public DeepCloner(java.lang.ClassLoader classLoader)
public DeepCloner()
private java.lang.Class<DoNotClone> getDoNotClone(java.lang.ClassLoader targetCL)
public <T> T clone(T objectToClone)
clone
in interface DeepClonerSPI
public <T> T clone(T objectToClone, boolean includeStandardJavaType)
includeStandardJavaType
- true
also clones standard java types (using
simple serialization), false
simply reference to
these objects (will be same instance).private static <T> java.lang.Class<T> getType(T object)
private static boolean isClass(java.lang.Object object)
private static void assertObjectNotNull(java.lang.Object object)
private <T> T performClone(java.lang.Class<T> targetClass, java.lang.Object source, boolean shouldCloneStandardJavaTypes)
private java.lang.Object cloneJavaReflectMethod(java.lang.Object source)
private boolean isJavaReflectMethod(java.lang.Class<?> cls)
private boolean isSunClass(java.lang.Class<?> cls)
private boolean isJavaReflectClass(java.lang.Class<?> cls)
private <T> boolean isSerializableCandidate(java.lang.Class<T> targetClass, java.lang.Object source)
private static boolean isImpliticlySerializable(java.lang.Class<?> cls)
private static boolean isSerializable(java.lang.Class<?> cls)
private java.lang.Object serializationClone(java.lang.Object source)
private void close(java.io.Closeable closeable)
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 static <T> boolean isStandardJavaType(java.lang.Class<T> targetClass)
private static boolean isStaticFinalModifier(java.lang.reflect.Field field)
private static boolean isIterable(java.lang.Object object)
private static boolean isIterable(java.lang.Class<?> cls)
private static java.lang.Enum getEnumValue(java.lang.Object enumValueOfSourceClassloader, java.lang.Class<java.lang.Object> enumTypeLoadedByTargetCL)
private java.lang.Object instantiateArray(java.lang.ClassLoader targetCL, java.lang.Class<?> arrayClass, java.lang.Object objectToClone, boolean cloneStandardJavaTypes)