Reflection



  • Konrad Rudolph schrieb:

    rapso schrieb:

    Konrad Rudolph schrieb:

    rapso schrieb:

    (wenn du 110 anrufst und zu einem vorfall die fragen an der gegenseite beantwortest, bist du auch die reflection schnittstelle fuer die.
    und wenn du ein commandline tool startest mit -h/-? bekommst du auch eine parameter liste 'reflektiert').

    Da interpretierst Du die Enthymologie des Worts falsch. „Reflektion“ leitet sich davon her, dass die Komponenten etwas über sich selbst wissen. Und das hat weder mit dem Hilferuf noch mit dem -aufruf etwas zu tun, diese Metapher ist daher irreführend. Vielmehr sind das alles Werkzeuge, die verwendet werden können, um Reflection in Sprachen zu emulieren, die sie nicht nativ unterstützen. Sprachen wie Assembler sind eben gerade nicht reflektiv – was einen natürlich nicht abhält, extern Informationen über Strukturen vorzuhalten.

    ich glaube du verstehst das beispiel lediglich nicht.

    Eben. Das sagt ja einiges über seine Qualität aus.

    oder die deiner verstaendnissfaehigkeit. da du nichtmal merkst dass

    und das macht deine behauptung bezueglich emulation auch nicht besser.

    Präzisier mal.

    die praezisierung drunter stand.

    von daher, wenn du's schaffst meine texte zu verstehen, hast du deine antworten, ansonsten kann ich dir mit weiteren texten von mir unmoeglich helfen.

    [edit] quotebugs gefixt



  • Reflection kann man z.B. einsetzen um Wrapper bzw. Proxies für Objekte zu erstellen die man nur z.T. kennt. z.B. wenn du weisst dass ein Objekt Interface X implementiert hat, und du möchtest ein paar Funktionen in Interface X überschreiben, möchtest aber dass sämtliche anderen implementierten Interfaces quasi 1:1 durchgereicht werden.

    Oder wenn du schnell und einfach Mocks erstellen willst, zum Unit-Testing.

    Oder wenn du detailierte Informationen über den Zustand eines Programmes oder eines Objektes ausgeben willst, z.B. beim Error-Logging.



  • Shade Of Mine schrieb:

    Die Definition von Reflection "informationen ueber eine blackbox bekommen" ist ziemlich gut.

    --help als Commandline Parameter liefert mir die Schnittstellendefinition des Programmes. Dabei ist die technik egal. Bei Konzepten ist technik immer komplett egal. Selbes bei OOP - Code ist entweder oop oder nicht, die Technik die dahinter steckt interessiert nicht.

    Grafiktreiber sind ein super Beispiel fuer Reflection. Ich frage das Sysem: was kannst du denn fuer Aufloesungen und bekomme eine Liste der Aufloesungen zurueck.

    Reflection beschreibt die Technik in einer (meist objektorientierten) Programmiersprache, Informationen über die Struktur des Programmes herauszufinden und zu modifizieren.
    Wenn z.B. ein Grafiktreiber eine Schnittstelle zum Auslesen der unterstützten Funktionen anbietet oder ein Shell-Programm auf Wunsch eine Bedienungsanleitung ausspuckt, hat das mit Reflection nichts zu tun.



  • rapso schrieb:

    Konrad Rudolph schrieb:

    rapso schrieb:

    ich glaube du verstehst das beispiel lediglich nicht.

    Eben. Das sagt ja einiges über seine Qualität aus.

    oder die deiner verstaendnissfaehigkeit.

    Mal ganz überspitzt: nö. Denn ein Beispiel soll doch zum Verständnis beitragen. Wenn ich da lang rumrätseln muss, hat es offensichtlich nicht seine Aufgabe erfüllt, allgemein verständlich zu sein.

    Denn:

    da du nichtmal merkst dass […] die praezisierung drunter stand.

    Darunter stand etwas vollkommen zusammenhangloses: Das, was Du da beschreibst mag ja alles Reflexion sein, habe ich auch nie angezweifelt. Deine Beispiele, zumindest aber das mit dem Notruf, hingegen beschreiben ganz allgemeine Kommunikationsprotokolle, das ist eine vollkommen andere Abstraktionsebene. Dass dieses Frage-Antwort-Spiel für Reflexion benutzt werden kann, stand nie zur Debatte. Und der Gebrauch des Wortes „reflektiert“ in Deinem Beispiel suggeriert einfach eine falsche Bedeutung („to reflect“ hat mehrere Übersetzungen und die von Dir benutzte ist hier die falsche). Mehr wollte ich gar nicht sagen.



  • tfa schrieb:

    Wenn z.B. ein Grafiktreiber eine Schnittstelle zum Auslesen der unterstützten Funktionen anbietet oder ein Shell-Programm auf Wunsch eine Bedienungsanleitung ausspuckt, hat das mit Reflection nichts zu tun.

    Es ist halt abstrakter, aber ob ich jetzt ein konkretes Objekt in Java frage, was es für Methoden hat, oder den Grafiktreiber, ist doch im Prinzip das selbe.

    PS: Ich hab das (rapsos) Beispiel auf Anhieb verstanden, also war es schonmal nicht allgemein unverständlich 🙂



  • Badestrand schrieb:

    tfa schrieb:

    Wenn z.B. ein Grafiktreiber eine Schnittstelle zum Auslesen der unterstützten Funktionen anbietet oder ein Shell-Programm auf Wunsch eine Bedienungsanleitung ausspuckt, hat das mit Reflection nichts zu tun.

    Es ist halt abstrakter, aber ob ich jetzt ein konkretes Objekt in Java frage, was es für Methoden hat, oder den Grafiktreiber, ist doch im Prinzip das selbe.

    Dann wäre ein gemeiner Methodenaufruf einer API (der irgendwas über diese API zurückliefert) wohl auch Reflection? Wenn du das so sehen willst, bitte. Das ist dann ein sehr allgemeines Verständnis dieses Begriffs.



  • tfa schrieb:

    Reflection beschreibt die Technik in einer (meist objektorientierten) Programmiersprache, Informationen über die Struktur des Programmes herauszufinden und zu modifizieren.
    Wenn z.B. ein Grafiktreiber eine Schnittstelle zum Auslesen der unterstützten Funktionen anbietet oder ein Shell-Programm auf Wunsch eine Bedienungsanleitung ausspuckt, hat das mit Reflection nichts zu tun.

    Typische Java Definition.

    Die Leute sehen immer nur die Implementierung und vergessen dass es beim Programmieren um Konzepte geht. Implementierungen sind irrelevant.

    Reflection bedeutet:
    ich habe eine Blackbox und will Metainformationen bekommen. Reflection ist nun der Name für das Konzept mit dem ich an die Daten rankomme.

    zB ist Java Reflection kein bisschen anders als --help als cl-argument. Denn auch bei Java Reflection ist ein getMethods() nichts anderes als ein --help. Sowohl die --help Message als auch die Liste der Methoden wurden beim Kompilieren automatisch erstellt.



  • Die "Java-Definition" scheint mir deutlich näher am allgemeinen Verständnis zu liegen, als die "shade of mine"-Definition.
    Ich geb zu, ich bin nicht all zu sehr "C++-verwurzelt", vielleicht würde ich die Definition dann auch stark erweitern, damit es passt.
    Wie auch immer, wenn du dich morgens beim Rasieren im Spiegel betrachtest, ist das schließlich auch Reflection 🤡



  • Ich gebe hier mal mein Verständnis von Reflektion wieder:

    Reflektion ist die Möglichkeit dynamisch zur Laufzeit Informationen über eine Komponente/DLL/Datentyp/Funktion... zu bekommen, und diese Ansprechen zu können. Dies umfasst auch die Möglichkeit eine Funktion mit einer vorher nicht bekannten Anzahl an Parametern ansprechen zu können.

    In Sprachen die Reflektion direkt unterstützen ist das oben genannte in der Regel ohne Mehraufwand möglich. In Sprachen die es nicht direkt unterstützen kann man es meist mehr oder weniger Simulieren (wobei man dann schon Aussagen zu einer Schnittstelle machen muß, z.B. das eine DLL immer eine bestimmte Funktion die nähere Informationen liefert, mitbringen muss).

    Ich wüßte aber nicht wie man z.B. unter C++ portabel eine erst zur Laufzeit bekannte Parameterliste füllen kann (Was z.B. unter C# geht)...

    cu André



  • asc schrieb:

    Ich wüßte aber nicht wie man z.B. unter C++ portabel eine erst zur Laufzeit bekannte Parameterliste füllen kann

    Na, mit einer Schlüssel-Wert-Zuordnung (oder, noch vereinfachter, einer geordneten Argumentmenge). Klar, ein wenig aufbohren müsste man da schon:

    class MethodInterface {
        virtual base* invoke() = 0;
        virtual size_t argument_count() const;
        virtual void bind_argument(string const& id, base* value);
        virtual ~MethodInterface() = 0;
    };
    
    MethodInterface::~MethodInterface() { }
    

    Dafür könnte man sich sogar nen Helper schreiben, der sowas zuließe:

    dynamic_invoke("method_name", arg("foo", foo), arg("bar", bar));
    

    /EDIT: Typo.



  • @Shadow Of Mine: Klar, deine Argumentation macht Sinn. Dummerweise kann ich fast jede Tätigkeit unter einem bestimmten Begriff zusammenfassen, wenn ich die Definition abstrakt genug betrachte.

    Wenn ein Hilfeparameter einer Konsolenanwendung Reflection bedeutet, dann ist das Starten eines Spiels unter Windows auch die Instanziierung eines Objektes. Und die Sekretärin implementiert abstrakte Klassen, weil sie ausgedruckte Formulare kopiert und sie mit unterschiedlichen Daten füllt.

    Jeder zweite Deutsche kann programmieren - ja, nämlich den Videorecorder und den Wecker. Damit ist er aber noch lange kein Programmierer.

    Letztendlich ist die Reflection im Sinne der Softwareentwicklung gemeint. Und hier handelt es sich um eine Methode, um zur Laufzeit Objektdetails wie Methoden und Attribute in Erfahrung zu bringen.



  • mit dieser definition wirst du dich nicht wirklich vom anfangs erwähnten grafikkarten-beispiel abgrenzen können.



  • Na und, nur weil irgendein Treiber irgendetwas ausliest, nennt man das Reflection? Als abstrakte Begriffe lasse ich mir z.B. "auslesen" gefallen. Aber Reflection beschreibt meiner Ansicht nach ein konkretes Programmierwerkzeug.

    http://de.wikipedia.org/wiki/Reflection_(Programmierung)

    Wenn das Grafiktreiberbeispiel als Reflection gültig ist, dann ist es auch Reflection wenn mich jemand fragt ob ich ein Auto besitze.



  • dann ist jeder getter Reflection



  • Konrad Rudolph schrieb:

    da du nichtmal merkst dass […] die praezisierung drunter stand.

    Darunter stand etwas vollkommen zusammenhangloses: Das, was Du da beschreibst mag ja alles Reflexion sein, habe ich auch nie angezweifelt. Deine Beispiele, zumindest aber das mit dem Notruf, hingegen beschreiben ganz allgemeine Kommunikationsprotokolle, das ist eine vollkommen andere Abstraktionsebene. Dass dieses Frage-Antwort-Spiel für Reflexion benutzt werden kann, stand nie zur Debatte. Und der Gebrauch des Wortes „reflektiert“ in Deinem Beispiel suggeriert einfach eine falsche Bedeutung („to reflect“ hat mehrere Übersetzungen und die von Dir benutzte ist hier die falsche). Mehr wollte ich gar nicht sagen.

    Du kannst ohne kommunikation keine reflection haben. du versuchst hier ein Pattern auf zwang mit einer implementierung zu koppeln. wie bloedsinnig waere es zu behaupten dass du in assembler keine linked list hast, nur weil da keine STL existiert und ein pointerdatentyp schon garnicht, also ist das nicht moeglich?
    Ein pattern ist unabhaengig von der implementierung. Ich kann durch 1000 dateien auf meiner festplatte gehen und auf vielerlei wegen herausfinden was es fuer dateien sind. das ist reflektion, dafuer muss ich nicht irgendwelchen attributen strings zuordnen, ich kann dir das bild einfach anzeigen wenn ich reflektieren kann welcher typ es ist und ich sein format kenne.
    schau dir einfach mal RTTI bei c++ an, das hat garkeine strings usw. um typeninformationen zu entnehmen

    nimm dir ein beispiel an:

    Wenn das Grafiktreiberbeispiel als Reflection gültig ist, dann ist es auch Reflection wenn mich jemand fragt ob ich ein Auto besitze.

    zwar sehr trotzig, aber trotzdem hat er es verstanden.

    reflect ist nur eine anleihe aus dem englischen und heisst 'wiedergeben', so wie man z.b. literatur reflectieren kann, indem man jemandem vom inhalt eines buches auf eigene weise erzaehlt, das vorher eine blackbox war fuer den hoerer.
    Der threadstarter hat keinesfalls gefragt, was java und reflektion auf sich hat, sondern nur was reflektion ist und mehr als informationen aus einer blackbox zu entnehmen ist es nicht. WIE du das machst, ist auf 1000 weisen loesbar und garnicht gegenstand der frage, und schon garnicht die klaerung was die einzig moegliche implementierung sein kann.
    ansonsten kann ich sicher anfangen zu quieken, dass RTTI alles noetige hat, oder reflektionwuensche aeussern, die auch Java nicht erfuellt.



  • superallgemeiner schrieb:

    dann ist jeder getter Reflection

    Solange es zur Laufzeit evaluiert wird, ja! Wenn es nur ein Zugriff auf einen Speicherbereich ist, nein!



  • reflect ist nur eine anleihe aus dem englischen und heisst 'wiedergeben', so wie man z.b. literatur reflectieren kann, indem man jemandem vom inhalt eines buches auf eigene weise erzaehlt, das vorher eine blackbox war fuer den hoerer.

    Eine Klasse ist auch ein abstrakter Begriff, und hängt nicht von der Implementierung ab, wie man sie in C++ und Java vorfindet. Ich kann Klassen somit auch in QBASIC programmieren. Schließlich sind Klassen ja nur ein Konzept, und die Implementierung ist nur ein Detail, das im "Konzept" nicht weiter interessiert.

    Trotzdem würde man QBASIC nicht als OOP bezeichnen.



  • LOLAlter schrieb:

    Trotzdem würde man QBASIC nicht als OOP bezeichnen.

    Es wurde schon hunderttausendmal gesagt, nun nochmal: Eine Sprache kann nicht OOP sein, sie kann nur OOP besonders gut oder auch nicht unterstützen.



  • rapso schrieb:

    Du kannst ohne kommunikation keine reflection haben.

    Ja und? Ohne Kommunikation kannst Du auch tausend andere Sachen nicht haben. Du hast trotzdem nur ein Beispiel für Kommunikation gebracht und nicht für Reflexion.

    Ein pattern ist unabhaengig von der implementierung. […] schau dir einfach mal RTTI bei c++ an, das hat garkeine strings usw. um typeninformationen zu entnehmen

    Wie oft denn noch? Das ist mir klar! Es ging mir lediglich um Dein Beispiel. Ich habe auch nie irgendwas von Strings oder anderen speziellen Techniken erzählt (mal davon abgesehen, dass es sehr wohl C++-Implementierungen gibt/gab, die Stringvergleiche der Typennamen für RTTI verwendet haben).

    nimm dir ein beispiel an:

    Wenn das Grafiktreiberbeispiel als Reflection gültig ist, dann ist es auch Reflection wenn mich jemand fragt ob ich ein Auto besitze.

    zwar sehr trotzig, aber trotzdem hat er es verstanden.

    Bring nicht meine Kritik mit der Kritik anderer Leute durcheinander. Ich habe nie etwas gegen die Grafikkartentreiber gesagt.

    reflect ist nur eine anleihe aus dem englischen und heisst 'wiedergeben', so wie man z.b. literatur reflectieren kann, indem man jemandem vom inhalt eines buches auf eigene weise erzaehlt, das vorher eine blackbox war fuer den hoerer.

    Du verwendest immer noch die falsche Übersetzung, auch wenn sie schon besser geworden ist.



  • LOLAlter schrieb:

    reflect ist nur eine anleihe aus dem englischen und heisst 'wiedergeben', so wie man z.b. literatur reflectieren kann, indem man jemandem vom inhalt eines buches auf eigene weise erzaehlt, das vorher eine blackbox war fuer den hoerer.

    Eine Klasse ist auch ein abstrakter Begriff, und hängt nicht von der Implementierung ab, wie man sie in C++ und Java vorfindet. Ich kann Klassen somit auch in QBASIC programmieren. Schließlich sind Klassen ja nur ein Konzept, und die Implementierung ist nur ein Detail, das im "Konzept" nicht weiter interessiert.

    Trotzdem würde man QBASIC nicht als OOP bezeichnen.

    Da sieht man es dass du es verstanden hast, mit gutem beispiel 👍
    das Klassenkonzept und eine sprache haben keinen zwanghaften zusammenhang, da hast du recht. man kann in allerlei sprachen objektorientiert programmieren. eine sprache die sowas von sich aus als grundlage anbieten ist ein nettes helferlein, aber keine grundlage der definition von objektorientiert.

    sagt ja auch niemand (mehr) dass z.b. java keine objektorientierte sprache ist nur weil sie keine moeglichkeit zur multiplen vererbung bietet.

    es ist nur zum eigenen vorteil, wenn man lernt werkzeuge und verfahren voneinander zu trennen.


Anmelden zum Antworten