@SuppressWarnings("unchecked") private static <T> T doClone(T value) throws Exception { if (value != null) { final Class<?> vClass = value.getClass(); if (vClass.isArray()) { value = cloneArray(value); } else if (value instanceof Collection) { value = (T) cloneCollection((Collection<Object>) value); } else if (value instanceof Map) { value = (T) cloneMap((Map<Object, Object>) value); } else if (isBasicType(vClass)) { // NOTHING SPECIAL TO DO HERE, THEY ARE INMUTABLE } else if (value instanceof Cloneable) { final Method cloneMethod = vClass.getMethod("clone", NO_PARAMS_DEF); if (Modifier.isPublic(cloneMethod.getModifiers())) { value = (T) cloneMethod.invoke(value, NO_PARAMS); } else { throw new CloneNotSupportedException("Cannot clone a " + value.getClass() + " object, clone() is not public"); } } else { throw new CloneNotSupportedException("Cannot clone a " + vClass.getName() + " object"); } } return value; }
@SuppressWarnings("unchecked") private static <T> T doClone(T value) throws Exception { if (value != null) { final Class<?> vClass = value.getClass(); if (vClass.isArray()) { value = cloneArray(value); } else if (value instanceof Collection) { value = (T) cloneCollection((Collection<Object>) value); } else if (value instanceof Map) { value = (T) cloneMap((Map<Object, Object>) value); } else if (isBasicType(vClass)) { // NOTHING SPECIAL TO DO HERE, THEY ARE INMUTABLE } else if (value instanceof Cloneable) { final Method cloneMethod = vClass.getMethod("clone", NO_PARAMS_DEF); if (Modifier.isPublic(cloneMethod.getModifiers())) { value = (T) cloneMethod.invoke(value, NO_PARAMS); } else { throw new CloneNotSupportedException("Cannot clone a " + value.getClass() + " object, clone() is not public"); } } else { throw new CloneNotSupportedException("Cannot clone a " + vClass.getName() + " object"); } } return value; }