static Object shallowClone(Object o) { if (o == null) return o; if (o instanceof List) ret cloneList((List) o); if (o instanceof Map) { final Map m = o instanceof TreeMap ? new TreeMap() : new HashMap(); m.putAll((Map) o); return m; } if (o instanceof String || o instanceof Number || o instanceof Boolean) return o; if (o instanceof Object[]) { Object[] l = (Object[]) o; ret l.clone(); } // clone an arbitrary custom object // TODO: use Constructor object and setAccessible //print("Cloning custom: " + o); final Object clone = o.getClass().newInstance(); Class c = o.getClass(); while (c != Object.class) { Field[] fields = c.getDeclaredFields(); for (final Field field : fields) { if ((field.getModifiers() & Modifier.STATIC) != 0) continue; field.setAccessible(true); final Object value = field.get(o); field.set(clone, value); } c = c.getSuperclass(); } return clone; }