static A cloneWithoutFields(A o, Set fieldsToSkip) ctex { if (o == null) null; final A clone = cast nuObject(o.getClass()); Class c = o.getClass(); while (c != Object.class) { Field[] fields = c.getDeclaredFields(); for (final Field field : fields) { if (contains(fieldsToSkip, field.getName())) continue; if ((field.getModifiers() & Modifier.STATIC) != 0) continue; field.setAccessible(true); field.set(clone, field.get(o)); } c = c.getSuperclass(); } return clone; } static A cloneWithoutFields(A o, S... fieldsToSkip) { ret cloneWithoutFields(o, asHashSet(fieldsToSkip)); }