Mit Java-Konstruktor.newInstance(args) , warum die "falsche Anzahl von Argumente" Fehler?
Warum hat dieses scheitern mit der Fehlermeldung :
Args are: -normi -nosplash
Exception in thread "main" java.lang.IllegalArgumentException: wrong
number of arguments
at sun.reflect.NativeConstructorAccessorImpl
.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl
.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl
.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at TSStack.main(TSStack.java:14)
Hier ist der code:
public static void main(String args[]) throws Exception {
System.out.println("Args are: " + args[0]+ " " + args[1] );
try {
Constructor<Site> c = Site.class.getDeclaredConstructor();
c.setAccessible(true); //use reflection to get access to
//this private constructor
c.newInstance( (Object[])args );
} catch (InvocationTargetException x) {
x.printStackTrace();
} catch (NoSuchMethodException x) {
x.printStackTrace();
} catch (InstantiationException x) {
x.printStackTrace();
} catch (IllegalAccessException x) {
x.printStackTrace();
}
}
- Niedlich - Sie versucht zu fangen, eine ganze Reihe von Ausnahmen, aber landete trotzdem fehlt trotzdem.
- Würde keinen Unterschied machen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Site.class.getDeclaredConstructor()
wird Ihnen ein Standard-Konstruktor ohne Argumente, so übergeben Sie müssen es ein leeres array von Argumenten, die nicht der Fall in deinem Beispiel (sonst würden Sie nicht auf die erste Zeile mitSystem.out.println()
).String[]
als argument, dann siehe mein post, wie dies zu tun.String[]
, dass derjenige, den Sie suchen, nicht leere argument ein.Wenn du diese Zeile:
Sind Sie immer wieder einen Konstruktor für die
Site
Klasse, keine Argumente, dagetDeclaredConstructor
ist eine Variable Funktion, die als Argumente eine Liste vonClass<?>
Objekte Beschreibung der argument-Typen. Da Sie nicht Liste nichts, Sie sind immer wieder ein nullary Konstruktor.Jedoch, Sie dann sollten Sie das Objekt durch Aufruf
Dieser versucht, die vorbeifahrenden
args
als Argumente. Es sei dennargs
leer ist, wird dies zu einem problem führen, da du explizit gefragt, für einen no-argument-Konstruktor.BEARBEITEN: Da der Konstruktor, die Sie suchen (basierend auf den obigen Kommentar) will in eine variable Anzahl von
String
s als argument, die Sie suchen möchten ein Konstruktor, der (glaube ich) nimmt in einem array vonString
s als argument, da intern variadischen Funktionen sind implementiert mit arrays. Gehen Sie dazu wie folgt vor:Wichtiger ist jedoch, warum sind Sie mit der spiegelung überhaupt? Es ist schneller, sauberer und sicherer zu machen, nur um zu schreiben
Dies ermöglicht Java statisch überprüfen Sie die Sicherheit Ihres Codes.
Hoffe, das hilft!