Ich möchte Class.newInstance()
verwenden, aber die Klasse, die ich instanziiere, hat keinen Nullkonstruktor. Daher muss ich Konstruktorargumente übergeben können. Gibt es eine Möglichkeit, dies zu tun?Kann ich Class.newInstance() mit Konstruktorargumenten verwenden?
Antwort
Sie können andere Konstruktoren mit getConstructor(...) erhalten.
myObject.getClass().getDeclaredConstructors(types list).newInstance(args list);
Edit: nach den Kommentaren scheint wie Klasse und Methodennamen zu zeigen ist nicht genug für einige Benutzer. Weitere Informationen finden Sie in der Dokumentation für getting constuctor und invoking it.
Antwort sagt nicht, wie Sie die Argumente übergeben oder ein Beispiel zeigen. Es ist nur eine Vermutung. – djangofan
Sollte es GetDeclaredConstructor (Singular) sein? –
@ryvantage macht es nicht wie eine statische Methode aussehen, da es in der "myObject" -Instanz aufgerufen wird. Es ist nur eine Verkettung von Methodenaufrufen. Auch nicht sicher, warum diese Antwort 55 Leuten nützlich war, weil es falsch ist und das Recht unten ist! – Arran
Class.getDeclaredConstructor(String.class).newInstance("HERESMYARG");
Nur klärende - 'getDeclaredConstructor' ist keine statische Methode, Sie müssen es auf die Instanz der Klasse für Ihre spezifische Klasse aufrufen. – clum
Scheint wie die Antwort ist "Nein" für Java 1.1 – Jim
Ich habe öffentlichen Konstruktor mit der Liste
Nicht verwenden Class.newInstance()
; Siehe dieses Thema: Why is Class.newInstance() evil?
Wie andere Antworten sagen, verwenden Sie stattdessen Constructor.newInstance()
.
Ich refaktoriert meinen Code basierend auf dieser Antwort, und ich denke, ist die beste Lösung –
Sie können die getDeclaredConstructor
Methode der Klasse verwenden. Es erwartet ein Array von Klassen. Hier ist ein erprobtes 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;
}
}
Ich denke, das ist genau das, was Sie wollen http://da2i.univ-lille1.fr/doc/tutorial-java/reflect/object/arg.html
Obwohl es einen toten Thread scheint, jemand könnte es nützlich
Angenommen, Sie haben die folgende
Konstruktorclass MyClass {
public MyClass(Long l, String s, int i) {
}
}
Sie müssen Sie zeigen wollen diesen Konstruktor verwenden wie so:
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);
gute Antwort .... –
Folgen Sie die nachstehenden Schritte, um den parametrisierten Konstruktor aufzurufen.
- Get
Constructor
mit Parametertypen, indem Typen inClass[]
fürgetDeclaredConstructor
Verfahren vonClass
- Konstruktor Instanz Erstellen von Werten in
Object[]
für
newInstance
Methode vonConstructor
Beispielcode vorbei:
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
Eine große Antwort ist die Chris Jester-Young man considere. –