Je voudrais instancier un objet à partir de son objet Class
, en utilisant le constructeur qui accepte un seul argument String
.
Voici un code qui approche ce que je veux:
Object object = null;
Class classDefinition = Class.forName("javax.swing.JLabel");
object = classDefinition.newInstance();
Cependant, il instancie l'objet JLabel
sans texte. Je voudrais utiliser le constructeur JLabel
qui accepte une chaîne comme texte initial. Existe-t-il un moyen de sélectionner un constructeur spécifique dans un objet Class
?
Class.newInstance
appelle le constructeur no-arg (celui qui ne prend aucun paramètre). Pour appeler un constructeur différent, vous devez utiliser le package de réflexion (Java.lang.reflect
).
Obtenez une instance Constructor
comme ceci:
Class<?> cl = Class.forName("javax.swing.JLabel");
Constructor<?> cons = cl.getConstructor(String.class);
L'appel à getConstructor
spécifie que vous voulez que le constructeur accepte un seul paramètre String
. Maintenant, pour créer une instance:
Object o = cons.newInstance("JLabel");
Et tu as fini.
P.S. N'utilisez la réflexion qu'en dernier recours!
Ce qui suit fonctionnera pour vous. Essaye ça,
Class[] type = { String.class };
Class classDefinition = Class.forName("javax.swing.JLabel");
Constructor cons = classDefinition .getConstructor(type);
Object[] obj = { "JLabel"};
return cons.newInstance(obj);
Class.forName("className").newInstance()
n'invoque toujours aucun argument constructeur par défaut.
Pour invoquer le constructeur paramétré au lieu du constructeur zéro argument sans argument,
Constructor
avec les types de paramètres en passant des types dans Class[]
pour getDeclaredConstructor
méthode de Class
Object[]
pournewInstance
méthode de Constructor
Exemple de code:
import Java.lang.reflect.*;
class NewInstanceWithReflection{
public NewInstanceWithReflection(){
System.out.println("Default constructor");
}
public NewInstanceWithReflection( String a){
System.out.println("Constructor :String => "+a);
}
public static void main(String args[]) throws Exception {
NewInstanceWithReflection object = (NewInstanceWithReflection)Class.forName("NewInstanceWithReflection").newInstance();
Constructor constructor = NewInstanceWithReflection.class.getDeclaredConstructor( new Class[] {String.class});
NewInstanceWithReflection object1 = (NewInstanceWithReflection)constructor.newInstance(new Object[]{"StackOverFlow"});
}
}
sortie:
Java NewInstanceWithReflection
Default constructor
Constructor :String => StackOverFlow
Parfois, il n'est pas nécessaire de créer un objet pour que la classe appelle ses constructeurs et ses méthodes. Vous pouvez appeler des méthodes de classe sans créer d'objet direct. Il est très facile d'appeler un constructeur avec un paramètre.
import Java.lang.reflect.*;
import Java.util.*;
class RunDemo
{
public RunDemo(String s)
{
System.out.println("Hello, I'm a constructor. Welcome, "+s);
}
static void show()
{
System.out.println("Hello.");
}
}
class Democlass
{
public static void main(String args[])throws Exception
{
Class.forName("RunDemo");
Constructor c = RunDemo.class.getConstructor(String.class);
RunDemo d = (RunDemo)c.newInstance("User");
d.show();
}
}
la sortie sera:
Bonjour, je suis constructeur. Bienvenue, utilisateur
Bonjour.
Class.forName ("RunDemo"); chargera la classe RunDemo.
Constructeur c = RunDemo.class.getConstructor (String.class); La méthode getConstructor () de la classe Constructor retournera le constructeur qui ayant String comme argument et sa référence est stocké dans l'objet 'c' de la classe Constructor.
RunDemo d = (RunDemo) c.newInstance ("Utilisateur"); la méthode newInstance () de la classe Constructor instanciera la classe RundDemo et renverra la version générique de l'objet et il sera converti en type RunDemo à l'aide de la conversion de type.
L'objet 'd' de RunDemo contient la référence retournée par la méthode newInstance ().