package org.raidenjpa.reflection; import java.util.HashMap; import java.util.Map; public class Cloner { private static final Map<Class<?>, BeanClass<?>> classes = new HashMap<>(); /** * Requires a no-args constructor * * @param original * @return shallow copy of original */ @SuppressWarnings("unchecked") public static <T> T shallowCopy(T original) { Class<? extends T> clazz = (Class<? extends T>) original.getClass(); BeanClass<? extends T> beanClass = (BeanClass<? extends T>) classes.get(clazz); if (beanClass == null) { beanClass = BeanClass.buildFrom(clazz); classes.put(clazz, beanClass); } return shallowCopyHelper(original, beanClass); } @SuppressWarnings("unchecked") private static <T, E extends T> E shallowCopyHelper(T original, BeanClass<E> beanClass) { try { E object = (E) original; return beanClass.shallowCopy(object); } catch (Throwable e) { throw new RuntimeException(e); } } }