Ich weiß, es gibt bereits mindestens eine Frage zu diesem Thema . Aber ich möchte es noch einmal fragen, denn das habe ich in der javadoc von Class#getDeclaredMethod(...)
:
Wenn mehr als eine Methode mit denselben Parametertypen in a deklariert ist Klasse, und eine dieser Methoden hat einen Rückgabetyp, der mehr ist Spezifischer als alle anderen wird diese Methode zurückgegeben; Andernfalls eine der Methoden wird willkürlich gewählt.
So betrachten die Entwickler der Reflexion in Java diesen Fall als wahrscheinlich, ist es vielleicht doch möglich, eine solche Erklärung zu machen? Oder ist es vielleicht nur veraltet?
Das JVM-Bytecode-Format erlaubt die Deklaration mehrerer Methoden mit demselben Namen und denselben Parametertypen, solange sich der Rückgabetyp unterscheidet, obwohl die Java -Sprache dies nicht zulässt. Das bedeutet a) andere JVM-Sprachen können davon Gebrauch machen und b) sie können für spezielle "Compiler-magische" Sprachfunktionen verwendet werden.
Am häufigsten gibt der Compiler beim Umgang mit Generika mehrere Methoden mit demselben Namen und denselben Parametertypen aus. Die JVM-Methoden-Suche basiert auf der vollständigen Übereinstimmung der Signatur und nicht nur auf den Parametertypen. Daher muss der Compiler sogenannte bridge
Methoden ausgeben, die andere Methoden signaturweise überschreiben oder überschatten. Betrachten Sie dieses Beispiel:
Die Klasse StringFoo
benötigt drei zusätzliche Bridge-Methoden, um die Interface-Methoden zu überschreiben, da sie die gleiche desc
haben:
Die Pseudo-Modifizierer synthetic bridge
sind zwei JVM-Zugriffs-Flags, die nur vom Compiler zum Markieren von automatisch generierten Methoden im Bytecode
Die Methode Class#getDeclaredMethods
gibt alle deklarierten Methoden zurück - einschließlich synthetischer Bridge-Methoden. Daher muss #getDeclaredMethod(String)
einen auswählen, der die tatsächliche Implementierung darstellt.
Tags und Links java reflection