package openmods.reflection; import java.lang.reflect.Constructor; import openmods.serializable.IInstanceFactory; import openmods.utils.SneakyThrower; public class ConstructorAccess<T> implements IInstanceFactory<T> { public static class ConstructorAccessException extends RuntimeException { private static final long serialVersionUID = 343341828278770966L; private static String createMessage(Constructor<?> ctor) { return String.format("Failed to create object of %s via constructor %s", ctor.getDeclaringClass(), ctor); } public ConstructorAccessException(Constructor<?> ctor, Throwable cause) { super(createMessage(ctor), cause); } public ConstructorAccessException(Constructor<?> ctor) { super(createMessage(ctor)); } } private Constructor<? extends T> ctor; public ConstructorAccess(Constructor<? extends T> ctor) { ReflectionLog.logLoad(ctor); ctor.setAccessible(true); this.ctor = ctor; } @Override public T create() { try { return ctor.newInstance(); } catch (Throwable t) { throw new ConstructorAccessException(ctor, t); } } public static <T> ConstructorAccess<T> create(Class<? extends T> cls) { try { Constructor<? extends T> c = cls.getConstructor(); return new ConstructorAccess<T>(c); } catch (Throwable t) { throw SneakyThrower.sneakyThrow(t); } } }