package mirror; import java.lang.reflect.Constructor; import java.lang.reflect.Field; public class RefConstructor<T> { private Constructor<?> ctor; public RefConstructor(Class<?> cls, Field field) throws NoSuchMethodException { if (field.isAnnotationPresent(MethodParams.class)) { Class<?>[] types = field.getAnnotation(MethodParams.class).value(); ctor = cls.getDeclaredConstructor(types); } else if (field.isAnnotationPresent(MethodReflectParams.class)) { String[] values = field.getAnnotation(MethodReflectParams.class).value(); Class[] parameterTypes = new Class[values.length]; int N = 0; while (N < values.length) { try { parameterTypes[N] = Class.forName(values[N]); N++; } catch (Exception e) { e.printStackTrace(); } } ctor = cls.getDeclaredConstructor(parameterTypes); } else { ctor = cls.getDeclaredConstructor(); } if (ctor != null && !ctor.isAccessible()) { ctor.setAccessible(true); } } public T newInstance() { try { return (T) ctor.newInstance(); } catch (Exception e) { return null; } } public T newInstance(Object... params) { try { return (T) ctor.newInstance(params); } catch (Exception e) { return null; } } }