web-dev-qa-db-fra.com

Puis-je utiliser Class.newInstance () avec des arguments de constructeur?

Je voudrais utiliser Class.newInstance() mais la classe que je suis en train d'instancier n'a pas de constructeur nullary. Par conséquent, je dois pouvoir passer des arguments de constructeur. Y a-t-il un moyen de faire cela?

227
omar
MyClass.class.getDeclaredConstructor(String.class).newInstance("HERESMYARG");

ou

obj.getClass().getDeclaredConstructor(String.class).newInstance("HERESMYARG");
192
jsight
myObject.getClass().getDeclaredConstructors(types list).newInstance(args list);

Éditer: selon les commentaires, il semble que pointer du nom de classe et de méthode ne soit pas suffisant pour certains utilisateurs. Pour plus d'informations, jetez un coup d'œil à la documentation de obtenir constuctor et l'invoquer .

87
Marko

En supposant que vous ayez le constructeur suivant

class MyClass {
    public MyClass(Long l, String s, int i) {

    }
}

Vous devrez montrer que vous avez l'intention d'utiliser ce constructeur comme suit:

Class classToLoad = MyClass.class;

Class[] cArg = new Class[3]; //Our constructor has 3 arguments
cArg[0] = Long.class; //First argument is of *object* type Long
cArg[1] = String.class; //Second argument is of *object* type String
cArg[2] = int.class; //Third argument is of *primitive* type int

Long l = new Long(88);
String s = "text";
int i = 5;

classToLoad.getDeclaredConstructor(cArg).newInstance(l, s, i);
66
Martin Konecny

Ne pas utiliser Class.newInstance(); voir ce fil: Pourquoi Class.newInstance () est-il diabolique?

Comme d’autres réponses, utilisez Constructor.newInstance() à la place.

17
Chris Jester-Young

Suivez les étapes ci-dessous pour appeler un consturateur paramétré.

  1. Obtenez Constructor avec les types de paramètre en passant les types dans la méthode Class[] pour getDeclaredConstructor de Class
  2. Créez une instance de constructeur en transmettant 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
8
Ravindra babu

Vous pouvez obtenir d'autres constructeurs avec getConstructor (...) .

8
iny

Je pense que c'est exactement ce que vous voulez http://da2i.univ-lille1.fr/doc/tutorial-Java/reflect/object/arg.html

Bien que cela semble un fil mort, quelqu'un pourrait le trouver utile

1
Spyros Doulgeridis

Vous pouvez utiliser la méthode getDeclaredConstructor de Class. Il attend un tableau de classes. Voici un exemple testé et fonctionnel:

public static JFrame createJFrame(Class c, String name, Component parentComponent)
{
    try
    {
        JFrame frame = (JFrame)c.getDeclaredConstructor(new Class[] {String.class}).newInstance("name");
        if (parentComponent != null)
        {
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        else
        {
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        }
        frame.setLocationRelativeTo(parentComponent);
        frame.pack();
        frame.setVisible(true);
    }
    catch (InstantiationException instantiationException)
    {
        ExceptionHandler.handleException(instantiationException, parentComponent, Language.messages.get(Language.InstantiationExceptionKey), c.getName());
    }
    catch(NoSuchMethodException noSuchMethodException)
    {
        //ExceptionHandler.handleException(noSuchMethodException, parentComponent, Language.NoSuchMethodExceptionKey, "NamedConstructor");
        ExceptionHandler.handleException(noSuchMethodException, parentComponent, Language.messages.get(Language.NoSuchMethodExceptionKey), "(Constructor or a JFrame method)");
    }
    catch (IllegalAccessException illegalAccessException)
    {
        ExceptionHandler.handleException(illegalAccessException, parentComponent, Language.messages.get(Language.IllegalAccessExceptionKey));
    }
    catch (InvocationTargetException invocationTargetException)
    {
        ExceptionHandler.handleException(invocationTargetException, parentComponent, Language.messages.get(Language.InvocationTargetExceptionKey));
    }
    finally
    {
        return null;
    }
}
1
Lajos Arpad