本文源码已过时,最终版本请前往https://github.com/LitnhJacuzzi/Clone-and-Equals
本文为完美克隆的源码解析,研究过程请参考:The Implementation Of Perfect Clone. — oracle-tech
首先是源码:
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import sun.misc.Unsafe;
public class PerfectClone
{
private static IArrayList clonedObjects = new IArrayList();
private static IArrayList clonedRetObjects = new IArrayList();
private static Unsafe unsafe = hackUnsafe();
public static <T> T clone(T target) {
clonedObjects.clear();
clonedRetObjects.clear();
return clone0(target, null);
}
/**
* Add {@code ret} parameter to reduce workload.
*/
@SuppressWarnings("unchecked")
private static <T> T clone0(T target, Object ret) {
if(target == null)
return null;
if(canDirectlyClone(target.getClass()))
return target;
if(target.getClass() == Object.class)
return (T) new Object();
if(isPackagingClass(target.getClass()))
return clonePackagingClassObject(target);
int index = clonedObjects.indexOf(target);
if(index != -1) return (T) clonedRetObjects.get(index);
if(target.getClass().isArray()) {
if(ret