Ce n'est pas de la triche, mais comme tout outil, il devrait être utilisé pour ce qu'il est censé résoudre. La réflexion, par définition, vous permet d'inspecter et de modifier le code par le biais de code; Si c'est ce que vous devez faire, alors la réflexion est l'outil indispensable. La réflexion est centrée sur le méta-code: code qui cible le code (par opposition au code normal qui cible les données).
Les classes génériques d’interface de service Web constituent un exemple d’utilisation judicieuse de la réflexion: une conception typique consiste à séparer la mise en œuvre du protocole de la fonctionnalité de charge utile. Vous avez donc une classe (appelons-la T
) qui implémente votre charge utile, et une autre qui implémente le protocole ( P
). T
est assez simple: pour chaque appel que vous voulez faire, écrivez simplement une méthode qui fait ce qu’elle est supposée faire. P
Toutefois, vous devez mapper les appels de service Web sur les appels de méthode. Rendre ce mappage générique est souhaitable, car il évite les redondances et est P
hautement réutilisable. Reflection fournit les moyens d'inspecter une classe T
au moment de l'exécution et d'appeler ses méthodes en fonction de chaînes passées P
via le protocole de service Web, sans aucune connaissance de la compilation lors de la compilation.T
. En utilisant la règle 'code about code', on peut affirmer que la classe P
a le code en classe T
dans ses données.
Pourtant.
Reflection vous fournit également des outils permettant de contourner les restrictions du système de types du langage. En théorie, vous pouvez transmettre tous les paramètres en tant que type object
et appeler leurs méthodes par réflexions. Voilà, le langage censé imposer une discipline de typage statique forte se comporte désormais comme un langage typé dynamiquement avec une liaison tardive, à la différence près que la syntaxe est beaucoup plus élaborée. Chaque exemple d'un tel modèle que j'ai vu jusqu'à présent a été un sale jeu et, invariablement, une solution dans le système de types de langue aurait été possible, et aurait été plus sûre, plus élégante et plus efficace à tous égards. .
Il existe quelques exceptions, telles que les contrôles d'interface graphique pouvant être liés aux données à différents types de sources de données non liées; Exiger que vos données implémentent une certaine interface afin que vous puissiez lier les données n'est pas réaliste, et le programmeur n'a pas non plus à implémenter d'adaptateur pour chaque type de source de données. Dans ce cas, il est plus utile d’utiliser la réflexion pour détecter le type de source de données et d’ajuster la liaison de données.