it-swarm.com.de

Kann ich Class.newInstance () mit Konstruktorargumenten verwenden?

Ich möchte Class.newInstance() verwenden, aber die Klasse, die ich instanziiere, hat keinen nullären Konstruktor. Daher muss ich Konstruktorargumente übergeben können. Gibt es eine Möglichkeit, dies zu tun?

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

oder

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

Bearbeiten: laut den Kommentaren scheint das Zeigen von Klassen- und Methodennamen für manche Benutzer nicht ausreichend zu sein. Weitere Informationen finden Sie in der Dokumentation zu Aufruf von constuctor und Aufruf von constuctor .

87
Marko

Angenommen, Sie haben den folgenden Konstruktor

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

    }
}

Sie müssen zeigen, dass Sie diesen Konstruktor wie folgt verwenden möchten:

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

Verwenden Sie nicht Class.newInstance(); siehe diesen Thread: Warum ist Class.newInstance () böse?

Verwenden Sie stattdessen Constructor.newInstance(), wie andere Antworten sagen.

17

Befolgen Sie die nachstehenden Schritte, um den parametrisierten Konstruktor aufzurufen.

  1. Holen Sie sich Constructor mit Parametertypen, indem Sie Typen in Class[] Für getDeclaredConstructor Methode von Class übergeben.
  2. Erstellen Sie eine Konstruktorinstanz, indem Sie Werte in Object[] Für übergeben
    newInstance Methode von Constructor

Beispielcode:

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

    }
}

ausgabe:

Java NewInstanceWithReflection
Default constructor
Constructor :String => StackOverFlow
8
Ravindra babu

Sie können andere Konstruktoren mit getConstructor (...) erhalten.

8
iny

Ich denke, das ist genau das, was Sie wollen http://da2i.univ-lille1.fr/doc/tutorial-Java/reflect/object/arg.html

Obwohl es ein toter Faden scheint, könnte es jemand nützlich finden

1

Sie können die Methode getDeclaredConstructor von Class verwenden. Es erwartet ein Array von Klassen. Hier ist ein getestetes und funktionierendes Beispiel:

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