303 votes

Création d'une instance en utilisant le nom de la classe et en appelant le constructeur

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");

"MyAttributeValue" est un argument au constructeur de MyClass .

485voto

Jon Skeet Points 692016

Oui, quelque chose comme :

Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] { ctorArgument });

Cela ne fonctionnera bien sûr 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 le Class pour cela, il faut Class.forName("foo.Outer$Nested") .

94voto

Joachim Sauer Points 133411

Vous pouvez utiliser Class.forName() pour obtenir un Class de la classe souhaitée.

Ensuite, utilisez getConstructor() pour trouver le Constructor objet.

Enfin, appelez newInstance() 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");

81voto

Peter Lawrey Points 229686

Vous pouvez utiliser des réflexions

return Class.forName(className).getConstructor(String.class).newInstance(arg);

13voto

tier777 Points 11

Si la classe n'a qu'un seul constructeur vide (comme les classes Android Activity ou Fragment, etc.) :

Class<?> myClass = Class.forName("com.example.MyClass");    
Constructor<?> constructor = myClass.getConstructors()[0];

4voto

Alan Escreet Points 1657

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X