Existe-t-il un moyen de créer une instance d'une classe particulière à partir du nom de la classe (dynamique) et de passer des paramètres à son constructeur ?
Quelque chose comme :
Object object = createInstance("mypackage.MyClass","MyAttributeValue");
Où "MyAttributeValue"
est un argument au constructeur de MyClass
.
Oui, quelque chose comme :
Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] { ctorArgument });
Bien sûr, cela ne fonctionnera que pour un seul paramètre de type chaîne, mais vous pouvez le modifier assez facilement.
Notez que le nom de la classe doit être entièrement qualifié, c'est-à-dire qu'il doit inclure l'espace de noms. Pour les classes imbriquées, vous devez utiliser un dollar (car c'est ce que le compilateur utilise). Par exemple :
package foo;
public class Outer
{
public static class Nested {}
}
Pour obtenir l'objet Class
de cette classe, vous devez utiliser Class.forName("foo.Outer$Nested" ;)
.
Vous pouvez utiliser [Class.forName()
][1] pour obtenir un objet [Class
][2] de la classe souhaitée.
Utilisez ensuite [getConstructor()
][3] pour trouver l'objet [Constructor
][4] souhaité.
Enfin, appelez [newInstance()
][5] sur cet objet pour obtenir votre nouvelle instance.
Class<?> c = Class.forName("mypackage.MyClass");
Constructor<?> cons = c.getConstructor(String.class);
Object object = cons.newInstance("MyAttributeValue");
[1] : http://download.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29 [2] : http://download.oracle.com/javase/6/docs/api/java/lang/Class.html [3] : http://download.oracle.com/javase/6/docs/api/java/lang/Class.html#getConstructor%28java.lang.Class...%29 [4] : http://download.oracle.com/javase/6/docs/api/java/lang/reflect/Constructor.html [5] : http://download.oracle.com/javase/6/docs/api/java/lang/reflect/Constructor.html#newInstance%28java.lang.Object...%29