JAVA getConstructor wirft NoSuchMethodException
Ich bin neu in JAVA
und ich versuche zu lernen Reflexion.
Ich möchte bestimmte Konstruktor (Kommissionierung die Beispiel-form hier)
aus meiner Klasse :
public class Example1 {
public Example1() {
}
public Example1(int i) {
}
public Example1(String s) {
System.out.println("using param = " + s);
}
public static void main(String[] args) throws Exception {
Class<?>[] paramTypes = String.class.getClasses();
Constructor<Example1> ctor = Example1.class.getConstructor(paramTypes);
ctor.newInstance("test");
}
}
Bekomme ich NoSuchMethodException
wenn Sie versuchen, zu instanziieren ctor
Was vermisse ich hier?
- Dein code nicht wirklich werfen eine Ausnahme. Es ist auch nicht kompilieren, da Sie nicht prüfen, für Ausnahmen NoSuchMethodException und SecurityException in main().
- Ich kann nicht sagen, was es nicht kompilieren, in meine station , durch die Art und Weise, warum das "-1" ?
- es ist nicht kompilieren, weil der Grund, ich habe es Ihnen gesagt-es gibt Ausnahmen, für die Sie brauchen, um zu überprüfen. Beispiel in der Antwort, die ich gepostet arbeiten, sollten auf Ihre station, nicht wahr? BTW, ich habe nicht downvote Sie Ihre Frage...
- Bitte fügen Sie
throws Exception
zu Ihremmain()
- Methode, und fügen Versuch, tatsächlich die Klasse instanziieren (ctor.newInstance("foo")
). Frage dann treffen die Website die Kriterien erfüllt und ich werde upvote es (wie es ist, es eigentlich gar nicht kompilieren/ausführen). - Ich vermute, dass
-1
haben etwas zu tun mit deinem code-Beispiel, weil es nicht kompilierbar ist es der uns daran hindert, reproduzieren Sie Ihr problem. Dies bedeutet, dass (1) die Beantwortung Ihrer Frage ist schwieriger, (2) zukünftige Leser vielleicht nicht in der Lage, um zu bestimmen, wenn Sie stehen vor demselben problem wie du. Versuchen Sie Verbesserung Ihrer Beispiel durch das hinzufügen vonthrows Exception
in Ihremmain
Methode (wie @TomášZíma vorgeschlagen). - Ich versuchte, Bearbeiten Sie die Frage, aber es werden peer-reviewed. Es wird einige Zeit dauern, bis die änderungen sichtbar sind (wenn es würde akzeptiert werden).
- Wenn ich mich richtig erinnere kann es sein sofort angenommen, durch den Autor des Beitrags. EDIT: Es scheint, dass meine Erinnerung war richtig 🙂
- Während die bearbeiteten code jetzt kompiliert feine wirft es
IllegalArgumentException
, nichtNoSuchMethodException
wie Sie behaupten, im Titel und in deinem Beitrag (so ist es immer noch nicht sehr nützlich für potentiell Leser auf der Suche nach Lösung fürNoSuchMethodException
) - Gemacht für die Platte, die ich nicht wirklich kümmern, die Partitur aber ich denke immer noch, meine Frage ist gut geschrieben und mit einer kleinen Menge von exp. bei der hand
- Es ist für Leute, die finden diese Frage später.
- Noch eine Letzte Bearbeiten 🙂 Nun, es wirft NoSuchMethodException, wie er erwähnt. Da
String.class.getClasses()
zurück leeres array UND es war eigentlich nicht-parametrische Konstruktor, es gefunden zu haben. Das problem ist aufgetreten, während versucht zu instanziieren (IllegalArgumentException
). Ich denke, es sollte OK sein und hilfreich für andere. - Mein edit habe abgelehnt (Abstimmung 3:2). Ich einfach entfernt die nicht-parametrische Konstruktor. Nun die Frage ist falsch, nicht sinnvoll und sollte entfernt werden, meine Antwort war eine Verschwendung von Zeit und all die änderungen war eine Verschwendung von Zeit, daher bin ich ganz ab, um Abneigung gegen diese Seite.
- In original-version dieses Frage es gab auch öffentliche no-argument-Konstruktor so konnte man davon ausgehen, dass Sie versucht, zu ändern, zu viel, IMO Sie Taten gute Arbeit, da Sie OP-job zu liefern Beispiel, das würden wir reproduzieren beschriebenen problem, nicht die Redakteure (da konnten Sie leicht übersehen wichtige Details, die verursacht werden, die möglicherweise problem).
- die Frage ist falsch" Nein, es war falsch, von Anfang an. Wenn jemand eine Antwort suchen und buchen code-Beispiel ist es sein/Ihr job, um sicherzustellen, dass dieses Beispiel tatsächlich reproduziert dieses problem (und nicht einführen, andere sind). Das ist, warum ich habe diese Frage auf-halten, um zu verhindern, dass das posten von Antworten bis Frage korrigiert werden.
- Problem mit dem Stack Overflow ist, dass die Menschen (vor allem hier) vergessen (oder wusste nicht von Anfang), dass "wir arbeiten zusammen, um eine Bibliothek von detaillierte Antworten auf jede Frage über die Programmierung". Was bedeutet dies? Wir sind nicht hier, um zu helfen, nur OP, aber jeder Leser, die möglicherweise vor ähnlichen problem. Das ist, warum wir erwarten von Fragen, um genau zu sein, so könnten wir schaffen 100% genaue Antwort. In diesem Fall Frage sollte auf Eis gelegt werden. Vermeiden Sie stressige-Situationen versuchen zu beantworten, nur Fragen, wo Sie sind in der Lage zu reproduzieren OP problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beispiel:
Beachten Sie, dass die Methode
getConstructor
eigentlich nicht ein array. Es ist folgendermaßen definiert:... was bedeutet, dass es akzeptiert variable Menge von Argumenten, die sollten weitergegeben worden sein, wie ich es Tat. Übergeben eines Arrays ist ebenfalls möglich, aber es ist nicht notwendig.
Was Sie getan haben, war ursprünglich das äquivalent zu:
Aber, was bedeutet
String.class.getClasses()
zurück? Gute Frage! Lets go debug:Gibt es eine Dokumentation über
getClasses()
: https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getClasses. Überprüfen Sie es und finden Sie heraus, der Grund, warum es so ist.Der Vollständigkeit halber. Die super-original-Frage (vor änderungen) enthalten eine weitere Konstruktor - eine nicht-parametrische eins:
Das problem was hier passiert, ist
IllegalArgumentException
geworfen. Es ist, weil, obwohlString.class.getClasses()
ein leeres array zurück, es gibt tatsächlich Konstruktor, der den Kriterien entspricht - eine nicht-parametrische Konstruktor! Es hat keine Argumente, und das array zurückgegebenString.class.getClasses()
nicht alles enthalten, auch. Dies bedeutet, dass der Konstruktor erfolgreich gefunden, aber wenn man versucht zu instanziieren es mitctor.newInstance("test")
, es schlägt fehl, da die gefundenen Konstruktor nicht akzeptieren keine Argumente.Versuchen Sie es mit
Dieser Rückkehr wird der Konstruktor mit einem parameter vom Typ String. Ihre Methode könnte die mehrere Werte zurückgeben und daher einen Konstruktor mit mehreren Parametern gesucht-aber nicht gefunden -> NoSuchMethodException geworfen.
Mehr Informationen über getClasses(): http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getClasses%28%29