Es ist kein Betrug, aber wie jedes Werkzeug sollte es für das verwendet werden, was es lösen soll. Durch Reflektion können Sie per Definition Code durch Code prüfen und ändern. Wenn Sie dies tun müssen, ist Reflexion das Werkzeug für den Job. Bei der Reflexion dreht sich alles um Meta-Code: Code, der auf Code abzielt (im Gegensatz zu regulärem Code, der auf Daten abzielt).
Ein Beispiel für eine gute Reflection-Verwendung sind generische Web-Service-Schnittstellenklassen: Ein typisches Design besteht darin, die Protokollimplementierung von der Nutzlastfunktionalität zu trennen. Dann haben Sie eine Klasse (nennen wir sie T
), die Ihre Payload implementiert, und eine andere, die das Protokoll ( P
) implementiert . T
ist ziemlich einfach: Schreiben Sie für jeden Anruf, den Sie tätigen möchten, einfach eine Methode, die das tut, was sie tun soll. P
Webdienstaufrufe müssen jedoch Methodenaufrufen zugeordnet werden. Es ist wünschenswert, dieses Mapping generisch zu machen, da es Redundanz vermeidet und in P
hohem Maße wiederverwendbar macht . Reflection bietet die Möglichkeit, Klassen T
zur Laufzeit zu untersuchen und ihre Methoden auf der Grundlage von Zeichenfolgen aufzurufen, die P
über das Webdienstprotokoll übergeben werden, ohne dass während der Kompilierung Kenntnisse über Klassen erforderlich sindT
. Mit der Regel 'Code über Code' kann man argumentieren, dass die Klasse P
den Code in der Klasse T
als Teil ihrer Daten hat.
Jedoch.
Reflection bietet Ihnen auch Tools, mit denen Sie Einschränkungen des Typsystems der Sprache umgehen können. Theoretisch können Sie alle Parameter als Typ übergeben object
und ihre Methoden über Reflections aufrufen. Voilà, die Sprache, die eine starke statische Typisierungsdisziplin durchsetzen soll, verhält sich jetzt wie eine dynamisch typisierte Sprache mit später Bindung, nur dass die Syntax weitaus ausgefeilter ist. Jede einzelne Instanz eines solchen Musters, die ich bisher gesehen habe, war ein schmutziger Hack, und ausnahmslos wäre eine Lösung innerhalb des Typensystems der Sprache möglich gewesen, und sie wäre in jeder Hinsicht sicherer, eleganter und effizienter gewesen .
Es gibt einige Ausnahmen, z. B. GUI-Steuerelemente, die an verschiedene nicht verwandte Arten von Datenquellen gebunden werden können. Es ist nicht realistisch, dass Ihre Daten eine bestimmte Schnittstelle implementieren, damit Sie sie binden können, und der Programmierer muss auch keinen Adapter für jeden Datenquellentyp implementieren. In diesem Fall ist es sinnvoller, die Art der Datenquelle durch Reflektion zu ermitteln und die Datenbindung anzupassen.