web-dev-qa-db-fra.com

Instancier un objet de classe avec un constructeur qui accepte un paramètre de chaîne?

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?

71
HAMID

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!

106
mwittrock

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);
13
Jothi

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,

  1. Vous devez obtenir Constructor avec les types de paramètres en passant des types dans Class[] pour getDeclaredConstructor méthode de Class
  2. Vous devez créer une instance de constructeur en passant des valeurs dans Object[] pour
    newInstance 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
3
Ravindra babu

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 ().

1
reshmi reddy