Wird die Java-Instanz des Operators als Reflektion betrachtet und was definiert Reflektion?

24

Ich hatte heute eine Diskussion mit einem Kollegen, ob die Verwendung des Java-Operators instanceofeine Art Reflexion ist. Und die Diskussion entwickelte sich schnell zu dem, was Reflexion eigentlich definiert.

Was ist also die Definition von Reflexion?

Und wird die Verwendung von instanceof"Reflexion verwenden" in Betracht gezogen?

Und wenn instanceofman darüber hinaus von Reflexion spricht, heißt Polymorphismus dann nicht auch "Reflexion verwenden"? Wenn nicht, was ist der Unterschied?

Bjarke Freund-Hansen
quelle
4
Sie haben so ziemlich Ihre eigene Frage beantwortet. Wie Sie "Reflexion" definieren, bestimmt, ob instanceofes sich um ein Beispiel für Reflexion handelt. Sicherlich liegt es irgendwo zwischen der normalen Datennutzung und der Metadatennutzung über getClass()& friends, aber Sie können auf andere Weise brauchbare Definitionen haben.
Kilian Foth
Wird die Verwendung von return"struktureller Programmierung" in Betracht gezogen?
SF.

Antworten:

22

Dies ist die Definition von Reflektion nach Wikipedia:

In der Informatik ist Reflexion der Prozess, mit dem ein Computerprogramm zur Laufzeit seine eigene Struktur und sein Verhalten beobachten (Introspektion durchführen) und modifizieren kann.

Ich hätte es selbst nicht besser sagen können und den wichtigen Teil für Ihre Frage hervorgehoben. Das heißt, ja, instanceofwird mit Reflektion betrachtet. Das Programm beobachtet seine Struktur und führt eine Selbstbeobachtung durch .

Falke
quelle
3
@Steven Jeuris: Der Unterschied ist, dass es if (true)sich um einen Wert handelt , nicht um einen Typ . Deshalb wird es nicht als Reflexion betrachtet.
sleske
1
@sleske: Der Grund, warum ich es erwähnt habe, ist, dass das Beobachten eines Typs ein so rudimentäres Prinzip ist. Ohne sie gäbe es keinen Polymorphismus. Technisch gesehen bedeutet dies, dass eine einfache Übersteuerung auch als Reflexion betrachtet werden kann (oder zumindest dazu führt). Vergessen Sie nicht den zweiten Teil der Definition: und ändern Sie seine eigene Struktur und sein Verhalten zur Laufzeit. Alles in allem habe ich diese Antwort positiv bewertet (siehe meinen zweiten Kommentar), aber ich verstehe, woher die Frage des OP stammt. ; p
Steven Jeuris
1
Wäre normaler Polymorphismus nach dieser Definition von Reflexion nicht auch eine Art Reflexion?
Bjarke Freund-Hansen
4
@bjarkef: Ich würde "nein" sagen, da der vom Polymorphismus verwendete virtuelle Versand implizit durch die Sprache selbst erfolgt und nicht durch den Anwendungscode, der das betreffende Objekt explizit untersucht, um seine Merkmale zu identifizieren.
Dave Sherohman
2
@ Dave Sherohman: Ich möchte auch hinzufügen, dass der größte Teil der Arbeit (Einrichten von Sprungtabellen usw.) zur Kompilierungszeit und nicht zur Laufzeit ausgeführt wird.
TMN
13

Aus Gründen der Klarheit würde ich zwei Antworten in Betracht ziehen.

Theoretisch , instanceofist eine Form der Reflexion, wie in erläutert Falcon Antwort .

In der Informatik ist Reflexion der Prozess, mit dem ein Computerprogramm zur Laufzeit seine eigene Struktur und sein Verhalten beobachten (Introspektion durchführen) und modifizieren kann.

In der Praxis bezieht sich ein Programmierer jedoch, wenn er über die Verwendung von Reflexion spricht, in der Regel auf viel mehr, als nur zu prüfen, ob eine Variable von einem bestimmten Typ ist. Dies ist ein so rudimentäres Konzept, ohne das Polymorphismus nicht möglich wäre .

Beachten Sie, dass die Verwendung von instanceofhäufig auf einen Codegeruch hinweist und stattdessen häufig der richtige Polymorphismus verwendet werden kann.

Steven Jeuris
quelle
1
+1 für den potenziellen Code Geruch - nicht immer nur das Potenzial
Gary Rowe
2

Der folgende Artikel könnte Sie interessieren: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

Der Schlüssel in diesem Artikel ist ein Codeausschnitt, in dem das Schlüsselwort "instanceof" mithilfe der Methode "isInstance" der Klasse "Class" simuliert wird, die Teil der Reflection-Funktion von Java ist.

Jalayn
quelle
Gute Erklärung für Java.
Falcon
2

Seit den anderen Antworten wurde die Definition in Wikipedia geändert (ich stimme dieser Änderung zufällig zu, war aber nicht derjenige, der sie vorgenommen hat), um den Teil in Klammern zu entfernen:

In der Informatik ist Reflexion die Fähigkeit eines Computerprogramms, seine eigene Struktur und sein eigenes Verhalten zur Laufzeit zu untersuchen, zu untersuchen und zu modifizieren.

https://en.wikipedia.org/wiki/Type_introspection sagt auch speziell

Introspektion sollte nicht mit Reflektion verwechselt werden

Ich würde nicht die Ansicht , instanceofunter der ersten Definition fallen: das Programm einen Wert untersucht, nicht seine eigene Struktur, und es beinhaltet keine Werte Programmstruktur darstellt (in Java: java.lang.Class, java.reflect.Method, etc.); das Markenzeichen der Reflexion arbeitet mit solchen Werten.

Alexey Romanov
quelle
-5

JA, "instanceof" -Operator ist eine Form der Reflexion. In den vorherigen Antworten erfahren Sie, warum.

"Reflection" oder "object / class introspection" ist heutzutage ein Hype, aber einige Programmiersprachen verwenden seit einiger Zeit dieses Konzept.

DOT NET (Java-Klon), (mis) verwendet viel.

umlcat
quelle
1
Uuuuhm, ... Alter?
Konrad Rudolph
3
Ihr erster Satz ist korrekt und angesichts früherer Antworten überflüssig. Der Rest ist einfach falsch.
Frank Shearar