La création d'une instance en utilisant le nom de la classe et de l'appel de constructeur
Est-il un moyen de créer une instance d'une classe particulière donné le 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 du constructeur de MyClass
.
Vous devez vous connecter pour publier un commentaire.
Oui, quelque chose comme:
Qui ne fonctionne que pour un seul paramètre de chaîne de cours, mais vous pouvez le modifier assez facilement.
Noter que le nom de la classe doit être complet, c'est à dire y compris l'espace de noms. Pour les classes imbriquées, vous devez utiliser un dollar (comme c'est ce que le compilateur utilise). Par exemple:
Pour obtenir le
Class
objet, vous devezClass.forName("foo.Outer$Nested")
.newInstance()
est un varargs méthode (tout commeGetConstructor()
), il n'y a pas besoin expliciteObject
-création de la matrice.Object[]
argument, je préfère créer le tableau explicitement dans ce cas.Class.forName
et vos tests vous montrer? 🙂String.class
un faut argument pourgetConstructor
? De nombreux de nombreux exemples en ligne de le faire. Quelques exemples montrent l'intention étant d'obtenir le constructeur pour une classe en fait, est unString
paramètre de son constructeur, tandis que d'autres ne le font pas.ctorArgument
?Vous pouvez utiliser
de la Classe.forName()
pour obtenir unClass
objet de la classe désirée.Ensuite utiliser
getConstructor()
pour trouver le désiréConstructeur
objet.Enfin, appelez
newInstance()
sur l'objet pour obtenir votre nouvelle instance.Vous pouvez utiliser réflexions
Class.forName(className).getConstructor().newInstance();
😉Si la classe n'a qu'un seul constructeur vide (Activité ou un Fragment, etc, android classes):
Constructor<?> ctor = clazz.getConstructor(String.class)
ne semble pas fonctionner pour moi.lors de l'utilisation de (c)
getConstructor(String.lang)
le constructeur doit être déclarée public.Sinon un
NoSuchMethodException
est levée.si vous souhaitez accéder à un non-constructeur public vous devez utiliser à la place (c'est à dire)
getDeclaredConstructor(String.lang)
.Vous voulez utiliser java.lang.de réfléchir.Constructeur.newInstance(Objet...)
Moyen très Simple pour créer un objet en Java à l'aide de
Class<?>
constructeur avec argument(s) de passage:Cas 1:-
Ici, est un petit code dans ce
Main
classe:Et, ici, c'est le
Base
structure de classe:Cas 2:- Vous, pouvez code de la même façon pour le constructeur avec de multiples argument et le constructeur de copie. Pour exemple, en passant de 3 arguments en paramètre à la
Base
constructeur aurez besoin du constructeur à être créé dans la classe et un changement de code ci-dessus que:Et voici la classe de Base devait ressembler à:
Remarque:- Ne pas oublier de traiter les diverses exceptions qui doivent être traitées dans le code.
Si quelqu'un est à la recherche d'un moyen de créer une instance d'une classe en dépit de la classe suivant le Pattern Singleton, voici une façon de le faire.
Cela ne fonctionne que pour les classes qui implémentent le pattern singleton à l'aide d'un constructeur privé.
Vous pouvez également appeler des méthodes à l'intérieur de l'objet créé.
Vous pouvez créer un objet instantanée, par l'évocation de la première constractor et ensuite appeler la première méthode dans l'objet créé.
String
comme paramètre? Devient un peu désordonné lorsque vous modifiez constructeur afingetConstructor(ClassName.class)
est mieux, je suppose. Même si l'ordre des constructeurs changements dans la classe, pas besoin de trouver la position manuellementUne autre réponse utile. Comment puis-je utiliser getConstructor(params).newInstance(args)?
Dans mon cas, mon constructeur de la classe prend Webdriver comme paramètre, donc utilisé le code ci-dessous: