Olá pessoal,
Estou usando reflection e abstraí o problema que estou tendo para o seguinte conjunto de classes para facilitar o entendimento:
package reflectiontest;
public abstract class Xpto {
}
package reflectiontest;
public class XptoChild extends Xpto {
}
package reflectiontest;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Foo {
private Xpto xpto;
public Foo(Xpto xpto){
this.xpto = xpto;
}
public static void main(String[] args) throws SecurityException, IllegalArgumentException, ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
Xpto xpto = (Xpto) createInstance(XptoChild.class, new Object[0]);
Foo foo = (Foo) createInstance(Foo.class, new Object[] { xpto });
System.out.println("test");
}
private static Object createInstance(Class<?> classDefinition, Object ... args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
if (args != null && args.length > 0){
Class<?>[] parameterTypes = new Class[args.length];
for (int i = 0; i < args.length; i++){
parameterTypes[i] = args[i].getClass();
}
Constructor<?> constructor = classDefinition.getDeclaredConstructor(parameterTypes);
return constructor.newInstance(args);
}else{
return classDefinition.newInstance();
}
}
}
Estou recebendo o seguinte erro:
[color=red]Exception in thread "main" java.lang.NoSuchMethodException: reflectiontest.Foo.
at java.lang.Class.getConstructor0(Class.java:2706)
at java.lang.Class.getDeclaredConstructor(Class.java:1985)
at reflectiontest.Foo.createInstance(Foo.java:28)
at reflectiontest.Foo.main(Foo.java:15)[/color]
Por reflection, o construtor não pode ser encontrado uma vez que o parâmetro que estou passando (XptoChild) não é identificado como classe filha de Xpto (Parâmetro do construtor da classe Foo).
Obrigado pela atenção e até mais,