Reflection
-
Wozu braucht man Reflection?
-
um aus einer blackbox informationen zu extrahieren.
-
Ich meinte: Konkrete Anwendungsbeispiele.
-
kjhkjhjk schrieb:
Ich meinte: Konkrete Anwendungsbeispiele.
zB: plugins
generell alles was mit information zu tun hat die zur compiletime nicht feststeht
-
das kann man doch aber auch so machen mit DLLs. Wo ist der Vorteil von Reflection? Außerdem ist doch Reflection langsamer?
-
'so machen' ist aber nicht gerade genau zu entnehmen was du meinst. ich hab deswegen keine ahnung wie wir das zu reflection differenzieren sollen. kannst du genauer definieren was du meinst?
-
z.B. ein allgemeines Persistenceframework schreiben.
-
rapso schrieb:
'so machen' ist aber nicht gerade genau zu entnehmen was du meinst. ich hab deswegen keine ahnung wie wir das zu reflection differenzieren sollen. kannst du genauer definieren was du meinst?
Plugins kann man auch in C schreiben, wo man kein Reflection hat.
-
kjhkjhjk schrieb:
rapso schrieb:
'so machen' ist aber nicht gerade genau zu entnehmen was du meinst. ich hab deswegen keine ahnung wie wir das zu reflection differenzieren sollen. kannst du genauer definieren was du meinst?
Plugins kann man auch in C schreiben, wo man kein Reflection hat.
und objektorientierte programme kann man in assembler schreiben.
kaum ein sprachfeature ist wirklich unersetzlich.
wenn man dlls laedt, hat man auch quasi eine schwache form von reflection dabei: man sieht die exportierten funktionen der dll und kann diese dann nach bestimmten mustern aufrufen.
das ist reflection. echte reflection geht weiter, aber im prinzip ist es nichts anderes.
-
OK, und inwiefern geht echte Reflection weiter?
-
kjhkjhjk schrieb:
OK, und inwiefern geht echte Reflection weiter?
Das du vorher nicht wissen musst welche Funktionen die Komponente anbietet, du erfragst gewissermaßen. Schau dich mal bei Komponentensystemen um, wie (D)COM, Corba, EJB usw. Damit du Komponenten dynamisch hinzufügen kannst benötigst du Introspektion (Reflection).
-
kjhkjhjk schrieb:
rapso schrieb:
'so machen' ist aber nicht gerade genau zu entnehmen was du meinst. ich hab deswegen keine ahnung wie wir das zu reflection differenzieren sollen. kannst du genauer definieren was du meinst?
Plugins kann man auch in C schreiben, wo man kein Reflection hat.
Reflection ist nichts was an eine sprache gebunden ist. in asm/c/c++/lua etc. kann man reflection nutzen. es sagt nur aus, dass eine bekannte schnittstelle besteht die dir erlaubt informationen ueber eine blackbox zu erfragen.
Man kann plugins selbstverstaendlich auch so schreiben, dass sie an eine vordefinierte schnittstelle passen.(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').
-
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.
Analog dazu kann man in C ja auch objektorientiert programmieren, trotzdem ist C keine objektorientierte Sprache.
-
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.
und das macht deine behauptung bezueglich emulation auch nicht besser. reflektion gab es schon lange bevor es in sprachen eingebaut war, ich hab das vor 20jahren schon benutzt, jedesmal wenn ich mit assembler von pc komponenten ihre faehigkeiten erfragte, bzw ihre schnittstellen fuer weiteres vorgehen. z.B. VESA fuer hardwareschnittstellen beschreibung, openGL hat diese reflection fuer extensions seit anbegin, das hat mit sprachen nicht viel zu tun. auch nicht mit emulation, es ist lediglich eine der vielen arten schnittstellen zu koppeln, auch wenn es immer neue funky namen bekommt um ein paar ahnungslose zu blenden, wie "Plug&Play", "RTTI" etc.
-
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.
und das macht deine behauptung bezueglich emulation auch nicht besser.
Präzisier mal.
-
Reflection ist ein Konzept und Java-Reflection ist nicht die einzige Reflection Implementierung die es gibt. Bei solchen Diskussion wird sich immer auf die Java Definition verbissen.
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 in Java: ich frage ein objekt: wie sieht deine Schnittstelle aus und bekomme eine Liste der Methoden.
Komplett identisch vom Konzept her. Die technik variiert natuerlich, aber technik ist nur ein implementierungstrick - nicht mehr.
du musst die technik ignorieren. zB koennte die antwort auf ein --help von der Shell ja automatisch generiert werden indem sie metainformationen vom binary abfragt. aber das ist komplett irrelevant fuer das konzept selber. denn es funktioniert genau gleich unabhaengig davon wie es implementiert ist.
stell dir mal vor was passiert wenn irgendwo eine exception fliegt: unterschiedliche compiler implementieren es komplett unterschiedlich - auch zwischen sprachen gibt es riesen unterschiede. aber das konzept ist das selbe - exceptions. auch wenn die implementierung nicht einen buchstaben gleichen code haben sollte.
-
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.