hola, mi problema es el siguente, resulta que necesito crear instancias de objetos que no son conocidos en tiempo de ejecución a través de sus constructores (todo esto con ayuda del package java.lang.reflect.*)
El problema en si es que no puedo crear instancias de constructores que tengan como argumento un int[] (pero si puedo si es un String[], char[], etc)
dejo el código de dos clases para ver si alguien me puede ayudar
public class AlgorithmModel {
public AlgorithmModel(int numLines) {
System.out.println("load Constructor with int arguments...");
System.out.println("numLines = " + numLines);
}
public AlgorithmModel(String[] arrayString) {
System.out.println("load Constructor with String[] arguments...");
for(int i = 0; i < arrayString.length; i++)
System.out.println("arrayString[" + i + "] = " + arrayString[i]);
}
public AlgorithmModel(int[] arrayInt) {
System.out.println("load Constructor with int[] arguments...");
for(int i = 0; i < arrayInt.length; i++)
System.out.println("arrayInt[" + i + "] = " + arrayInt[i]);
}
}
Esta clase lo unico que hace es servir de conejillo de indias para probar la creacion de distintas instancias.
import java.lang.reflect.*;
class SampleConstructor {
public static void main(String[] argss) {
AlgorithmModel model;
Class AlgorithmModelDefinition;
Class[] argsClass = new Class[] {};
Object[] args = new Object[] {};
Constructor argsConstructor;
argsClass = new Class[] { int.class };
Integer numLines = new Integer(24);
args = new Object[] { numLines };
try {
AlgorithmModelDefinition = Class.forName("AlgorithmModel");
argsConstructor = AlgorithmModelDefinition.getConstructor(argsClass) ;
model = (AlgorithmModel) createObject(argsConstructor, args);
} catch (ClassNotFoundException e) {
System.out.println(e);
} catch (NoSuchMethodException e) {
System.out.println(e);
}
System.out.println("\n");
argsClass = new Class[] { String[].class };
String[] arrayString = new String[] { new String("Hello") , new String("World") };
args = new Object[] { arrayString };
try {
AlgorithmModelDefinition = Class.forName("AlgorithmModel");
argsConstructor = AlgorithmModelDefinition.getConstructor(argsClass) ;
model = (AlgorithmModel) createObject(argsConstructor, args);
} catch (ClassNotFoundException e) {
System.out.println(e);
} catch (NoSuchMethodException e) {
System.out.println(e);
}
System.out.println("\n");
argsClass = new Class[] { int[].class };
Integer[] arrayInt = new Integer[] { new Integer(12) , new Integer(25) };
args = new Object[] { arrayInt };
try {
AlgorithmModelDefinition = Class.forName("AlgorithmModel");
argsConstructor = AlgorithmModelDefinition.getConstructor(argsClass) ;
model = (AlgorithmModel) createObject(argsConstructor, args);
} catch (ClassNotFoundException e) {
System.out.println(e);
} catch (NoSuchMethodException e) {
System.out.println(e);
}
}
public static Object createObject(Constructor constructor, Object[] arguments) {
System.out.println ("Constructor: " + constructor.toString());
Object object = null;
try {
object = constructor.newInstance(arguments);
return object;
} catch (InstantiationException e) {
System.out.println(e);
} catch (IllegalAccessException e) {
System.out.println(e);
} catch (IllegalArgumentException e) {
System.out.println(e);
} catch (InvocationTargetException e) {
System.out.println(e);
}
return object;
}
}
Esta clase es la que crea una instancia por cada constructor de la clase anterior.
Al ejecutar el programa, funciona tofo ok, hasta la creación de la instancia con int[]
Constructor: public AlgorithmModel()
load Constructor with null arguments...
Constructor: public AlgorithmModel(java.lang.String,boolean)
load Constructor with String and boolean arguments...
name = Testing load class...
flag = true
Constructor: public AlgorithmModel(int)
load Constructor with int arguments...
numLines = 24
Constructor: public AlgorithmModel(java.lang.String[])
load Constructor with String[] arguments...
arrayString[0] = Hello
arrayString[1] = World
Constructor: public AlgorithmModel(int[])
java.lang.IllegalArgumentException: argument type mismatch
Lo extraño que encuentro es que me reconoce bien el constructor, pero los argumentos que les paso no.
Si alguien me puede ayudar, gracias de antemano.