В простейшем случае это выглядит так:
| Код | public static Object clone(Object orig) throws IllegalAccessException, InstantiationException { if(orig == null) return null; Class clazz = orig.getClass(); if(isImmutableOrPrimitive(clazz)) return orig;
Object copy = clazz.newInstance(); while(clazz != Object.class && clazz != null) { copyFields(clazz.getDeclaredFields(), orig, copy); clazz = clazz.getSuperclass(); } return copy; }
private static void copyFields(Field[] fields, Object source, Object target) throws IllegalAccessException, InstantiationException { for(Field field : fields) { if(Modifier.isStatic(field.getModifiers())) continue; if(Modifier.isFinal(field.getModifiers())) { System.err.println("final field[" + field + "] found at " + source.getClass() + ", skipped"); continue; } field.setAccessible(true); Class fieldType = field.getType(); if(isImmutableOrPrimitive(fieldType)) { Object val = field.get(source); field.set(target, val); } else if(fieldType.isArray()) { Class componentType = fieldType.getComponentType(); Object sourceArray = field.get(source); int len = Array.getLength(sourceArray); Object targetArray = Array.newInstance(componentType, len); for(int i = 0; i < len; i++) { Object val = Array.get(sourceArray, i); val = clone(val); Array.set(targetArray, i, val); } field.set(target, targetArray); } else { Object val = field.get(source); val = clone(val); field.set(target, val); } } }
private static boolean isImmutableOrPrimitive(Class clazz) { return clazz.isPrimitive() || clazz.isEnum() || clazz == String.class || clazz == Boolean.class || clazz == Character.class || clazz == Long.class || clazz == Integer.class || clazz == Short.class || clazz == Byte.class || clazz == Double.class || clazz == Float.class || clazz == Void.class; }
|
| Код | ArrayList<Object> list = new ArrayList<Object>(); list.add(new Date()); list.add("Some string"); list.add(33); list.add(new Dimension(10, 10)); ArrayList<String> sublist = new ArrayList<String>(); for(int i = 0; i < 3; i++) sublist.add(Integer.toString(i + 1)); list.add(sublist);
Object newList = clone(list); System.out.println("list = " + list); System.out.println("newList = " + newList); |
|