Ist es möglich, die Methode no modifier in einer Superklasse durch Java-Reflektion aufzurufen?Java-Reflektionszugriffsmethode mit Standardmodifikator in der Superklasse
Antwort
Ja. Möglicherweise müssen Sie setAccessible (true) für das Method-Objekt aufrufen, bevor Sie es aufrufen.
fail getmethod und getDeclaredMethod schlagen fehl, wenn sie für die Unterklasse aufgerufen werden. und setAccessible ist nicht erforderlich. – Bozho
Von diesem Kommentar würde ich vermuten, dass Sie versuchen, eine Methode mit Parametern aufzurufen. Sie müssen diese beim Nachschlagen der Methode angeben. – Stroboskop
Ich bin nicht das OP;) – Bozho
Method method = getClass().getSuperclass().getDeclaredMethod("doSomething");
method.invoke(this);
wenn Sie eine größere Hierarchie haben, können Sie verwenden:
Class current = getClass();
Method method = null;
while (current != Object.class) {
try {
method = current.getDeclaredMethod("doSomething");
break;
} catch (NoSuchMethodException ex) {
current = current.getSuperclass();
}
}
// only needed if the two classes are in different packages
method.setAccessible(true);
method.invoke(this);
(die obigen Beispiele für ein Verfahren sind benannt doSomething
ohne Argumente Wenn Ihre Methode Argumente hat, müssen Sie ihr hinzufügen. Typen als Argumente für die getDeclaredMethod(...)
Methode)
Wäre es nicht besser, 'Methode []' mit 'getDeclaredMethods()' zurück zu bekommen und zu überprüfen, ob wir einen Methodennamen haben, der eher übereinstimmt als die Ausnahme abzufangen? Ist letzteres nicht langsam, weil jedes Mal ein Stack-Trace generiert werden muss? Oder optimiere ich vorzeitig? :) –
Stacktraces werden träge erzeugt; Wenn Sie es nicht anfordern, wird es nicht generiert. Sie können dies testen, indem Sie in der Methode getOurStacktrace von Throwable und dann throw und exception einen Haltepunkt setzen. – Ajax
Nach dem Lesen der ursprünglichen Frage - ich realisiere, nahm ich an, Sie versuchten, eine überschriebene Methode aufzurufen. Was ich versucht habe zu tun und wie ich diesen Thread gefunden habe. Das Aufrufen einer nicht überschriebenen Basisklassenmethode sollte funktionieren, wie andere hier beschrieben haben. wenn Sie eine überschriebene Methode aufzurufen jedoch versuchen, meine Antwort steht wie folgt:
Ich glaube nicht, eine überschriebene Methode ist möglich Aufruf pro
http://blogs.oracle.com/sundararajan/entry/calling_overriden_superclass_method_on
Vor allem:
Method.invoke
Wenn die zugrundeliegende Methode eine Instanzmethode ist, wird sie mit dynamischer Methodensuche aufgerufen, wie in The Java Language Specification, Zweite Ausgabe, Abschnitt 15.12.4.4; insbesondere wird das Überschreiben basierend auf dem Laufzeittyp des Zielobjekts stattfinden.
- 1. Rufen Sie eine Methode aus der Superklasse der Superklasse
- 2. Assoziationsmapping mit gemappter Superklasse
- 3. Mock-Objekt der Superklasse in der Unterklasse mit EasyMock
- 4. IBOutlet-Eigenschaften der Superklasse überschreiben?
- 5. Zugriff auf Elementfunktion der Superklasse
- 6. Gson fromJson generische Superklasse mit
- 7. JsonGenerator-Ausgabe-Unterklasse mit Superklasse
- 8. Inject Federabhängigkeit in abstrakte Superklasse
- 9. Invoke "Superklasse" -Konstruktor in JavaScript
- 10. Smalltalk Superklasse vs Metaklasse?
- 11. Schienen - Superklasse nicht übereinstimmend
- 12. IDEA: So erstellen Sie toString() mit Superklasse
- 13. Annotationen auf entites mit gleichen Superklasse
- 14. jxBrowser Java Bridge ruft keine Methode in der Superklasse
- 15. Python Superklasse Reflexion
- 16. Autowinding Feder Superklasse
- 17. Wie implementieren Sie eine Superklasse, Unterklasse Beziehung in der Datenbank?
- 18. Call-Methode von der Superklasse von Super in Swift
- 19. Ruft eine überschriebene Methode aus der Superklasse in Typoskript auf
- 20. Python - was ist der bessere Weg zum Aufruf der Superklasse?
- 21. Interface/Superklasse für Collections/Container in C++
- 22. Java: zurückgebende Unterklasse in Superklasse Methodensignatur
- 23. Wie eine Superklasse zu erweitern und eine Methode oder Lazy Val in Superklasse Konstruktor Parameter aufrufen
- 24. Verwenden von ArrayLists in Superklasse/Unterklassenframework
- 25. Ist es möglich, in flex/as3 auf die Superklasse einer Superklasse zuzugreifen?
- 26. Überladen einer Methode einer Superklasse
- 27. Erstelle Instanz der Klasse oder Superklasse vom generischen Typ
- 28. Casting geerbte Klasse in der Liste der Superklasse nach der Serialisierung
- 29. Verständnis es6 Mixin Superklasse Konvention
- 30. Die Superklasse aller Event-Klassen
Beachten Sie, dass Sie angeben müssen, ob die Methode, die Sie aufrufen möchten, in der Unterklasse überschrieben wurde. Können Sie über Reflektion eine paketgeschützte Methode (auch Standardzugriff genannt) aufrufen? Ja. Können Sie eine überschriebene Methode über Reflektion aufrufen? Nein, die überschreibende Methode wird aufgerufen. Die folgenden Antworten treffen unterschiedliche Annahmen zu diesem Thema. –