package jef.tools.reflect; import java.lang.reflect.Array; import java.lang.reflect.Modifier; import java.sql.Time; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @SuppressWarnings("rawtypes") abstract class Cloner { abstract public Object clone(Object object, int restLevel); public static final Cloner RAW = new Cloner() { @Override public Object clone(Object object, int restLevel) { return object; } }; public static final Cloner DATE = new Cloner() { @Override public Object clone(Object object, int restLevel) { Date date = (Date) object; return new java.util.Date(date.getTime()); } }; public static final Cloner TIMESTAMP = new Cloner() { @Override public Object clone(Object object, int restLevel) { Timestamp ts = (Timestamp) object; return new java.sql.Timestamp(ts.getTime()); } }; public static final Cloner TIME = new Cloner() { @Override public Object clone(Object object, int restLevel) { Time time = (Time) object; return new java.sql.Time(time.getTime()); } }; public static final Cloner SQL_DATE = new Cloner() { @Override public Object clone(Object object, int restLevel) { java.sql.Date time = (java.sql.Date) object; return new java.sql.Date(time.getTime()); } }; static final Cloner _ArrayList = new Cloner() { @SuppressWarnings("unchecked") @Override public Object clone(Object object, int restLevel) { List source = (List) object; ArrayList list = new ArrayList(source.size()); for (Object obj : source) { list.add(CloneUtils._clone(obj, restLevel - 1)); } return list; } }; static final Cloner _HashSet = new Cloner() { @SuppressWarnings("unchecked") @Override public Object clone(Object object, int restLevel) { Set source = (Set) object; Set list = new HashSet(source.size()); for (Object obj : source) { list.add(CloneUtils._clone(obj, restLevel - 1)); } return list; } }; static final Cloner _HashMap = new Cloner() { @Override @SuppressWarnings("unchecked") public Object clone(Object object, int restLevel) { Map source = (Map) object; Map map = new HashMap(source.size()); Set<Map.Entry> entries = source.entrySet(); restLevel--; for (Map.Entry entry : entries) { map.put(CloneUtils._clone(entry.getKey(), restLevel), CloneUtils._clone(entry.getValue(), restLevel)); } return map; } }; static final Cloner _Array = new Cloner() { @Override public Object clone(Object obj, int restLevel) { int len = Array.getLength(obj); Class<?> priType = obj.getClass().getComponentType(); Object clone = Array.newInstance(priType, len); if (priType.isPrimitive()) { System.arraycopy(obj, 0, clone, 0, len); } else { for (int i = 0; i < len; i++) { Array.set(clone, i, CloneUtils._clone(Array.get(obj, i), restLevel - 1)); } } return clone; } }; /** * 通用的Map克隆器。 传入一个带空构造的Collection实现类即可。(非抽象) */ static final class _OtherCollection extends Cloner { private Class clz; public _OtherCollection(Class clz) { if (clz == null || Modifier.isAbstract(clz.getModifiers())) { throw new IllegalArgumentException(); } this.clz = clz; } @SuppressWarnings("unchecked") @Override public Object clone(Object object, int restLevel) { Collection source = (Collection) object; try { Collection list = (Collection) clz.newInstance(); for (Object obj : source) { list.add(CloneUtils.clone(obj)); } return list; } catch (InstantiationException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } } /** * 通用的Map克隆器。 传入一个带空构造的Map实现类即可。(非抽象) */ static final class _OtherMap extends Cloner { private Class clz; public _OtherMap(Class clz) { if (clz == null || Modifier.isAbstract(clz.getModifiers())) { throw new IllegalArgumentException(); } this.clz = clz; } @SuppressWarnings("unchecked") @Override public Object clone(Object object, int restLevel) { Map source = (Map) object; try { Map map = (Map) clz.newInstance(); Set<Map.Entry> entries = source.entrySet(); restLevel--; for (Map.Entry entry : entries) { map.put(CloneUtils._clone(entry.getKey(), restLevel), CloneUtils._clone(entry.getValue(), restLevel)); } return map; } catch (InstantiationException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } } }