java - with - Kann ich Class.newInstance() mit Konstruktorargumenten verwenden?




java newinstance deprecated (6)

Angenommen, Sie haben den folgenden Konstruktor

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

    }
}

Sie müssen zeigen, dass Sie beabsichtigen, diesen Konstruktor wie folgt zu verwenden:

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

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


Folgen Sie den nachstehenden Schritten, um den parametrisierten Konstruktor aufzurufen.

  1. getDeclaredConstructor Sie Constructor mit Parametertypen ab, indem Sie types in Class[] für getDeclaredConstructor Methode getDeclaredConstructor der Class
  2. Erstellen Sie eine Konstruktorinstanz, indem Sie Werte in Object[] for übergeben
    newInstance Methode des 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[]{""});

    }
}

Ausgabe:

java NewInstanceWithReflection
Default constructor
Constructor :String => 


Sie können die Methode getDeclaredConstructor der Klasse 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;
    }
}

Class.getDeclaredConstructor(String.class).newInstance("HERESMYARG");

myObject.getClass().getDeclaredConstructors(types list).newInstance(args list);

Edit: Nach den Kommentaren scheint es so, als ob die Angabe von Klassen- und Methodennamen für einige Benutzer nicht ausreicht. Weitere Informationen finden Sie in der Dokumentation zum Erstellen und Starten von constructor .





constructor