in src/main/java/com/vmware/vim/cf/DeepCopier.java [53:103]
public static Object deepCopy(Object src) throws InstantiationException, IllegalAccessException
{
Class<?> clazz = src.getClass();
// Just check if the object is mutable.
// We assume the object that is final is likely immutable.
// It's true for String, Integer and other data types.
if(Modifier.isFinal(clazz.getModifiers()))
{
return src;
}
Object dst = clazz.newInstance();
if(src instanceof Calendar)
{
((Calendar)dst).setTimeInMillis(((Calendar)src).getTimeInMillis());
return dst;
}
Field[] fields = clazz.getFields();
for(int i=0; i<fields.length; i++)
{
Object fObj = fields[i].get(src);
if(fObj == null)
{
continue;
}
Class<?> fRealType = fObj.getClass();
if((!fRealType.isPrimitive())
|| (!fRealType.isEnum())
|| fRealType.getPackage() != JAVA_LANG_PKG)
{
if(fRealType.isArray())
{
Object[] items = (Object[]) fObj;
fObj = Array.newInstance(fRealType.getComponentType(), items.length);
for(int j=0; j<items.length; j++)
{
Array.set(fObj, j, deepCopy(items[j]));
}
}
else
{
fObj = deepCopy(fObj);
}
}
fields[i].set(dst, fObj);
}
return dst;
}