Kann ich den Zugang zu den neuen Methoden in der anonymen inneren Klasse mit einigen syntax?
Gibt es eine Java-syntax für Zugriff auf neue Methoden definiert, die innerhalb der anonymen inneren Klassen von äußeren Klasse? Ich weiß, es kann verschiedene workarounds, aber ich Frage mich, ob eine spezielle syntax existiert?
Beispielsweise
class Outer {
ActionListener listener = new ActionListener() {
@Override
void actionPerformed(ActionEvent e) {
//do something
}
//method is public so can be accessible
public void MyGloriousMethod() {
//viva!
}
};
public void Caller() {
listener.MyGloriousMethod(); //does not work!
}
}
MEINE EIGENE LÖSUNG
Ich zog alle Methoden und member der äußeren Klasse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einmal die anonyme Instanz der Klasse wurde implizit umgewandelt in den Namen geben, es kann nicht gewirkt werden, zurück, weil es keine Namen für die anonymen Typ. Sie können die zusätzlichen Mitglieder der anonymen inneren Klasse durch
this
innerhalb der Klasse, in der der Ausdruck unmittelbar nach dem Ausdruck und der Art abgeleitet werden kann, und kehrte durch einen Aufruf der Methode.Einen Schüler in meiner Klasse gefragt, unser professor, wenn dies getan werden könnte, den anderen Tag. Hier ist, was ich schrieb, als ein kühles proof-of-concept, dass es getan werden KANN, obwohl es nicht Wert, es ist tatsächlich möglich, und hier ist, wie:
Durch die Verwendung der Java-Methode der Klasse können wir eine Methode aufzurufen, indem in der string-Wert und die Parameter der Methode. Gleiche kann getan werden, mit den Feldern.
Dachte nur, es wäre cool, zu teilen!
Ihre Anrufer-weiß
listener
alsActionListener
und daher weiß Sie nichts über diese neue Methode. Ich denke, der einzige Weg, dies zu tun (anderes als Reflexion gymnastik, die wirklich würde Niederlage der Zweck der Verwendung einer anonymen Klasse, d.h. Verknüpfung/Einfachheit) ist, einfach UnterklasseActionListener
und nicht eine anonyme Klasse.Nein, es ist imposible. Sie müssten, um den cast der ActionListener die real-Unterklasse Namen, aber da ist es anonym, es muss keinen Namen haben.
listener.that.MyGloriousMethod()
oder((Anonymous) listener).MyGloriousMethod()
da die anonyme Klasse ist eigentlich nicht anonym für die JVM, sondern nur seinen Namen unbekannt für die Programmierer und so, das problem ist genau zu bezeichnen, dass es irgendwie auch.Den richtigen Weg, es zu tun ist mit der spiegelung:
Können Sie hier überprüfen: Wie rufe ich eine Java-Methode gegeben, wenn der name der Methode als string?
Lustig genug, das ist jetzt möglich mit
var
konstruieren (Java 10 oder neuer). Beispiel:Hier mit der Methode Referenz, sondern arbeitet mit Punkt-Methode rufen Sie natürlich auch nicht. Es funktioniert auch mit Feldern. Genießen Sie eine neue Java. 🙂
Fand ich mehr tricks mit
var
und anonyme Klassen hier: https://blog.codefx.org/java/tricks-var-anonymous-classes/Ja, Sie können den Zugriff auf die Methode, siehe Beispiel unten, wenn Sie irgendwelche Zweifel bitte Kommentar