package eu.stratosphere.util.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class DynamicConstructor<DeclaringClass> extends DynamicInvokable<Constructor<DeclaringClass>, DeclaringClass, DeclaringClass> { /** * */ private static final long serialVersionUID = -3686535870776881782L; private Class<?> declaringClass; public DynamicConstructor() { super("<init>"); } @Override public void addSignature(final Constructor<DeclaringClass> member) { super.addSignature(member); if (this.declaringClass == null) this.declaringClass = member.getDeclaringClass(); else if (member.getDeclaringClass() != this.declaringClass) this.declaringClass = member.getDeclaringClass().isAssignableFrom(this.declaringClass) ? this.declaringClass : member.getDeclaringClass(); } @Override protected boolean isVarargs(final Constructor<DeclaringClass> member) { return member.isVarArgs(); } @Override protected Class<?>[] getParameterTypes(final Constructor<DeclaringClass> member) { return member.getParameterTypes(); } @Override protected DeclaringClass invokeDirectly(final Constructor<DeclaringClass> member, final Object context, final Object[] params) throws IllegalAccessException, InvocationTargetException, IllegalArgumentException, InstantiationException { return member.newInstance(params); } public DeclaringClass invoke(final Object... params) { return super.invoke(null, params); } /* * (non-Javadoc) * @see eu.stratosphere.util.reflect.DynamicInvokable#needsInstance(java.lang.reflect.Member) */ @Override protected boolean needsInstance(final Constructor<DeclaringClass> member) { return false; } @Override protected Constructor<DeclaringClass> findMember(final Class<DeclaringClass> clazz, final Class<?>[] parameterTypes) throws NoSuchMethodException { return clazz.getDeclaredConstructor(parameterTypes); } @SuppressWarnings("unchecked") @Override public Class<DeclaringClass> getReturnType() { return (Class<DeclaringClass>) this.declaringClass; } @SuppressWarnings("unchecked") public static <C> DynamicConstructor<C> valueOf(final Class<C> clazz) { final DynamicConstructor<C> ctor = new DynamicConstructor<C>(); for (final Constructor<?> constructor : clazz.getDeclaredConstructors()) ctor.addSignature((Constructor<C>) constructor); return ctor; } }