Diskussion:Reflexion (Programmierung)

aus Wikipedia, der freien Enzyklopädie
Letzter Kommentar: vor 6 Monaten von CyDeFect in Abschnitt Introspektion vs Reflexion
Zur Navigation springen Zur Suche springen

Introspektion vs Reflexion[Quelltext bearbeiten]

Die Definitionen scheinen mir nicht ganz korrekt zu sein, oder zumindest ungenau. Habe aber gerade nicht die Zeit, um den Artikel umzustricken. Hier ist eine kurze Notiz, die ich noch aufm Desktop rumfliegen habe, Java-bezogen:

Introspektion ist das Auslesen der Schnittstellenbeschreibung von Klassen während der Programmausführung. Dazu werden die introspektiven Methoden des Class-Objekts der untersuchten Instanz verwendet, welche die entsprechenden Information als Ergebnisse liefern.

Durch Reflexion werden als Ergebnisse ausführbare Methoden-Objekte zurückgegeben, dementsprechend lassen sich Klassen flexibel aus Methoden fremder Klassen konstruieren.


Hi!

Ich verfasse für mein Informatikstudium gerade eine wissenschaftliche Arbeit über die Java Reflection API und bin deshalb über diesen Artikel gestolpert. Leider ist der Artikel nicht gerade detailiert und was noch schlimmer ist: Einige Aussagen sind schlicht und einfach nicht korrekt!

Sie haben völlig Recht! Reflection ≠ Introspection!!! Introspection ist neben Intercession nur ein Teilgebiet von Reflection. Im Artikel wird der Aspekt von Intercession völlig ausgeblendet.

(Sehr) einfach formuliert:[Quelltext bearbeiten]

Introspection dient dazu Metainformationen (völlig allgemein...nicht nur Schnittstellenbeschreibungen) zur Laufzeit zu ermitteln. Im Bezug auf Attribute beinhaltet das auch den lesenden (und schreibenden) Zugriff auf die Attributswerte (v.a. wichtig für Serialisierung z.B. im Bezug auf SOAP).

Unter Intercession versteht man eine dynamische Veränderung der Struktur von Meta-Level-Objekten. Beispiele:

  • zur Laufzeit neue Klassen definieren
  • zur Laufzeit einer Klasse völlig neue Methoden und Attribute geben
  • Veränderung der Klassenhierarchie zur Laufzeit (sehr ungewöhnich aber per Def.)

Weitere Aspekte von Reflection sind z.B. das dynamische Aufrufen von Methoden anhand ihrer Signatur zur Laufzeit (invoke) oder auch Sicherheitsmechanismen (z.B. zur Datenkapselung), wie sie die Java Reflection API zur Verfügung stellt (z.B. kann man auf Private Attribute mit Reflection nur zugreifen, wenn man für das Attribut-Meta-Objekt setAccessible aufruft).

In Java wurde bewusst auf Intercession verzichtet, weshalb hier immer wieder Reflection ausschließlich mit Introspection gleichgesetzt wird. Die Formulierung "Reflexion bzw. Introspektion" ist einfach nur FALSCH! Es besteht auch keine Zeitabhängigkeit (früher Introspection -> heute Reflection), wie man es leider oft in Foren liest.

Ich kann hier als Literatur nur das Buch "Java Reflection In Action" von Dr. Ira Forman (es gibt leider keine deutsche Übersetzung) empfehlen.

Anmerkungen:

  • Andere Sprachen, wie C# stellen durchaus Intercession-Konstrukte bereit.
  • Oben definieren Sie Introspection mit introspektiv...nicht übel nehmen, aber so eine Erklärung ist nicht gerade hilfreich ;-)
  • Einige Formulierungen im Artikel sind einfach zu oberflächlich und decken nicht alle Aspekte ab

-- 79.234.196.137 13:09, 3. Mai 2009 (CEST)Beantworten

Ich habe diese Unterscheidung nun in den ersten definierenden Satz übernommen und einen Beleg dafür angegeben. Ich behaupte außerdem, dass es im Deutschen die Begriffe Introspektion und Intercession nicht in der Informatik-Fachsprache gibt. Daher habe ich beide als englische Begriffe genannt. Wer anderweitige Belege findet, kann diese gerne nennen und den Artikel wieder ändern. --Ormek (Diskussion) 11:42, 2. Okt. 2021 (CEST)Beantworten

Alles völlig richtig!
Reflexion ist keine Voraussetzung für dynamische Typsicherheit. Voraussetzung ist, daß das Laufzeitsystem genügend Informationen hat um die Typen zu überprüfen, eine Reflexionsimplementierung kann dafür verwendet oder „mißbraucht“ werden.
Das Smalltalk-Beispiel zeigt das dynamische Senden von Nachrichten, das hat nichts mit Reflexion zu tun. Man sollte das Ruby-Beispiel nach Smalltalk portieren. --CyDeFect (Diskussion) 19:12, 20. Okt. 2023 (CEST)Beantworten
Das Smalltalk-Beispiel habe ich jetzt korrigiert. --CyDeFect (Diskussion) 12:17, 21. Okt. 2023 (CEST)Beantworten

Abschnitt Details überarbeiten[Quelltext bearbeiten]

Für mich liest sich der Abschnitt wie eine unstrukturierte Stichpunktsammlung. Der müsste mal etwas klarer geschrieben und umsortiert werden. --Amtiss, SNAFU ? 15:53, 6. Sep. 2020 (CEST)Beantworten

Reflexion mit und ohne API[Quelltext bearbeiten]

Der Artikel spricht von Reflexion generell dann, wenn Typinformationen zu Laufzeit vorliegen. Ich denke, es wäre dann sinnvoll zu unterscheiden zwischen der rein internen Verwendung (z. B. ein Interpreter realisierte mit Hilfe der Meta-Information dynamische Typsicherheit) und einem reflexiven API, das es einem Programmierer in der Sprache selbst ermöglicht die Informationen abzufragen und zu verwenden.

Ich bin mir allerdings nicht sicher, ober der Artikel nicht generell darin irrt auch die nicht zur Programmierung nutzbare Metainformation als Reflexion einzustufen. Aufgrund fehlender Belege, lässt sich das schwer überprüfen. ;)

--Ormek (Diskussion) 11:58, 2. Okt. 2021 (CEST)Beantworten

Code-Beispiele[Quelltext bearbeiten]

Hallo zusammen.

Grundsätzlich ist der Artikel ja gut gelungen, doch die letzte Zeile Beispielcode stösst mir ein wenig auf: "System.out.println("Vorname von " + person + " ist " + getStringProperty(person, "getVorname"));"

Ich unterstelle mal, dass "person" ein Objekt ist. Wieso wird dies dann als String verwendet? Hat jemand den Stringcast-Operator für dieses Objekt überladen oder wieso gibt person einen Wert zurück? Das finde ich etwas verwirrend und andere sicher auch. Ein Listing der Klasse wäre sicher hilfreich...

cDoreOff: sicherlich ist das Beispiel verwirrend, aber durchaus geläufig für Java. In Java ist diese Schreibweise erlaubt. Das Resultat ist, dass auf dem Objekt person die Methode toString() aufgerufen wird.

Eventuell könnte man auch als praxisorientiertes Anwendungsbeispiel die Konfigurierbarkeit zur Laufzeit nennen. Mir fällt da spontan die Anzeige verschiedener Daten für verschiedene User ein. Jeder bekommt seine eigene Konfigurationsdatei, in der zum Beispiel festgehalten wird welche Informationen in den Spalten einer Tabelle dargestellt werden sollen und welche nicht. Die anzuzeigenden Infos werden dann während der Laufzeit abgefragt, das entlastet den Arbeitsspeicher usw.

Nur als kleine Anregung - wie gesagt =).


cDoreOff: Ich habe allerdings ein anderes Problem mit diesem Artikel. Es findet keine klare Trennung zwischen Introspektion und Reflektion statt.

cDoreOff: Das Beispiel gefällt mir auch nicht so dolle. Es zeigt nicht den beliebten Einsatz der Reflektion/Introspektion. Z.B. Interessant dann, wenn man z.B. auf der Klasse, die als Objekt vorliegt einen Konstruktor aufrufen möchte. Oder auch einfach nur auf unerlaubte Felder/Methoden eines Objekts zugreifen möchte. Es fehlt in dem Artikel so zu sagen der Sinn und Zweck der Introspektion.

Deine Beispiele halte ich allerdings auch nicht für optimal. Das sind ja eher Java-spezifische Hacks um Einschränkungen der Sprache zu umgehen. Sinnvoller fände ich z.B.:
* Persistenz
* Debugger/Class Browser/Interpreter
* Testframeworks (alle Methoden finden und aufrufen, die mit "test" beginnen)
Oefe 18:29, 5. Mär 2006 (CET)
Sehe ich auch so, habe mal ein Beispiel in Python eingefügt, deine Ideen kann man damit leicht zeigen (oder einfach im Text erwähnen, dass sowas dadurch möglich wird, fände ich glaube ich besser). TRauMa 16:17, 1. Mai 2006 (CEST)Beantworten

Hallo,

ich hatte ein typisches Beispiel für Perl eingefügt. Es wurde gelöscht, es sei nicht notwendig. Reflexions in Perl nimmt man in der täglichen Programmierpraxis kaum als etwas Besonderes war. Es ist extrem einfach die Implementierung zu ändern.

Es sind hier einige übertriebene Beispiele enthalten, welche den Artikel unnötig aufblähen und Platz für andere Sprachen blockieren.

Wenn man sich den englischen Artikel anschaut, ist dieser um Größenordnungen allgemeiner gehalten. Dieser verdreht auch nicht den Ursprung der Idee zu den stark getypten Programmiersprachen hin, in denen Reflections aufwendiger umzusetzen sind.

Ich bitte darum, das Codebeispiel wieder einzufügen oder das aus der englischen Seite.

--STEFFENW

Reflections Beispiel[Quelltext bearbeiten]

Das Python-Beispiel ist doch ein Scherz oder ? Es ist länger und wesentlich unleserlicher als das alte Java-Beispiel. Dies hier ist nicht der Ort um seine Programmierkenntnisse zu präsentieren. Das ursprüngliche Java-Beispiel ist wesentlich besser geeignet, alleine schon desswegen da es sich leicht auf andere OO-Sprachen abbilden läßt und durch die Java-typischen natürlichsprachlichen Konstrukte einfacher verständlich sind. Ich bin also dafür das Python-Beispiel wieder gegen das Java-Beispiel auszutauschen.--matrixx 10:51, 21. Jul 2006 (CEST)

Aktuelles Python Beispiel erscheint mir kurz und prägnant --Ormek (Diskussion) 12:06, 2. Okt. 2021 (CEST)Beantworten

person == Klasse; person != Objekt[Quelltext bearbeiten]

Hallo, ich will ja nicht kleinlich erscheinen, aber handelt es sich bei person nicht um eine konkrete Instanz (= ein Objekt) der Klasse person?!

"... Die folgende Anweisung würde dann die Methode getVorname() des Objekts der Klasse person aufrufen und deren Rückgabewert ausgeben.

System.out.println("Vorname von " + person + " ist " + getStringProperty(person, "getVorname")); ..."

Richtig: person benennt ein Objekt. Zu welcher Klasse es gehört (kann Person oder Schüler oder Mensch ... sein) wissen wir nicht. Der Satz braucht keine Veränderung. --Ormek (Diskussion)
Jain. getVorname() ist eine Objektmethode, keine Klassenmethode (also statische Methode). Um es genauer zu machen könnte man im sysout Beispiel statt "person" z.B. "john" schreiben um es besser von der Klasse Person unterscheiden zu können. --matrixx 17:34, 6. Dez. 2006 (CET)Beantworten
Ich würde mal in Frage stellen, ob es sinnstiftend ist, person so wie im Bespiel zu gebrauchen. Da drängt sich dem unbedarften Leser die Frage auf, wozu ich Reflection brauche, wenn ich das Objekt einfach zwischen zwei Strings packen und ausdrucken kann. (Wichtig: Bitte nicht hier erklären, sondern im Artikel!) --193.254.155.48 16:07, 22. Sep. 2009 (CEST)Beantworten
Keines der Beispiele verwendet Reflexion sinnvoll, sondern zeigen nur die minimalistische Verwendung der API. --Ormek (Diskussion) 12:20, 2. Okt. 2021 (CEST)Beantworten

Praktisches Beispiel?[Quelltext bearbeiten]

Jetzt habe ich hier Reflexion in mehreren Sprachen als Beispiel. Aber irgendwie erschließt sich mir noch nicht der Nutzen. Gibt es ein anschauliches Beispiel wo Reflexion von Nutzen ist?--80.64.189.222 11:10, 19. Jan. 2009 (CET)Beantworten

Ja!

  • Die meisten Reflection APIs erlauben es, Klassen zur Laufzeit dynamisch zu laden und Instanzen davon zu erstellen. Geht man davon aus, das in der OOP letztendlich ganze Programme als Klasse definiert sind, ist es also möglich, von seinem eigenen Programm aus dynamisch zur Laufzeit ander Programme einzubinden und mit diesen interagieren zu können. Auf gut Deutsch: PlugIns bzw. AddIns....wo findet man das alltäglich? Firefox, Eclipse, Winamp, etc.
  • Serialisierung von Objekten, die nicht das Interface Serializable implementieren (bezogen auf Java)...das kommt häufig vor, da unwissende Programmierer diese Deklaration beim Klassenentwurf vergessen bzw. nicht darüber bescheid wissen. Mit Introspection können trotzdem dynamisch alle Attributswerte gelesen und wiederhergestellt werden.
  • Dokumentation des Quellcodes, da über Introspection ermittelt werden kann, welche Methoden, Exceptions, Attribute, Konstruktoren, etc. eine Klasse alles besitzt.
  • Reflection ist ganz nützlich bei der Umsetzung von Design Patterns (häufig verwendet bei Singleton-, Decorator- und Factory-Pattern)

-- 79.234.196.137 13:32, 3. Mai 2009 (CEST)Beantworten

Selbstmodifizierender Code?[Quelltext bearbeiten]

Ist das das Gleiche wie selbstmodifizierender Code, wie er bspw. in Schadsoftware vorkommen kann, um sich vor Antivirensoftware zu verstecken? Wenn ja, wie gehen die Antivirensoftwarehersteller damit um, wenn praktisch jede normale Anwendung, die diese Technik verwendet, sich selbst modifiziert? --46.5.95.121 09:06, 15. Mär. 2018 (CET)Beantworten