20 votes

Quelle est l'utilité de la réflexion en Java/C#, etc.

Je suis juste curieux, pourquoi devrions-nous utiliser réflexion en premier lieu ?

// Without reflection
Foo foo = new Foo();
foo.hello();

// With reflection
Class cls = Class.forName("Foo");
Object foo = cls.newInstance();
Method method = cls.getMethod("hello", null);
method.invoke(foo, null);

Nous pouvons simplement créer un objet et appeler la méthode de la classe, mais pourquoi faire de même en utilisant les fonctions forName, newInstance et getMthod ?

Pour que tout soit dynamique ?

35voto

Jon Skeet Points 692016

En termes simples : parce que parfois, vous ne connaissez pas les parties "Foo" ou "hello" au moment de la compilation.

La grande majorité du temps, vous faire le savent, donc ce n'est pas la peine d'utiliser la réflexion. Mais il arrive parfois que vous ne le sachiez pas, et à ce moment-là, la réflexion est tout ce que vous pouvez faire.

A titre d'exemple, tampons de protocole vous permet de générer du code qui contient soit du code complet typé statiquement pour la lecture et l'écriture des messages, soit juste assez pour que le reste puisse être fait par réflexion : dans le cas de la réflexion, le code de chargement/sauvegarde doit obtenir et définir les propriétés par réflexion - il connaît les noms des propriétés impliquées grâce au descripteur de message. Cette méthode est beaucoup plus lente, mais elle permet de générer beaucoup moins de code.

Un autre exemple serait l'injection de dépendances, où les noms des types utilisés pour les dépendances sont souvent fournis dans les fichiers de configuration : le cadre DI doit alors utiliser la réflexion pour construire tous les composants impliqués, en trouvant les constructeurs et/ou les propriétés en cours de route.

6voto

Bozho Points 273663

Il est utilisé chaque fois que vous (=votre méthode/votre classe) ne sait pas au moment de la compilation le type doit être instancié ou la méthode qu'il doit invoquer.

De plus, de nombreux frameworks utilisent la réflexion pour analyser et utiliser vos objets. Par exemple :

  • hibernate/nhibernate (et tout mappeur objet-relationnel) utilise la réflexion pour inspecter toutes les propriétés de vos classes afin d'être en mesure de les mettre à jour ou de les utiliser lors de l'exécution des opérations de la base de données.
  • vous pouvez souhaiter rendre configurable la méthode d'une classe définie par l'utilisateur qui sera exécutée par défaut par votre application. La valeur configurée est String et vous pouvez obtenir la classe cible, la méthode portant le nom configuré et l'invoquer, sans le savoir au moment de la compilation.
  • l'analyse des annotations est effectuée par réflexion

3voto

deamon Points 15181

Une utilisation typique est un mécanisme de plug-in, qui prend en charge des classes (généralement des implémentations d'interfaces) qui sont inconnues au moment de la compilation.

3voto

Vous pouvez utiliser la réflexion pour automatiser tout processus qui pourrait utilement utiliser une liste des méthodes et/ou des propriétés de l'objet. Si vous avez déjà passé du temps à écrire du code qui fait à peu près la même chose sur chacun des champs d'un objet à tour de rôle - la façon évidente de sauvegarder et de charger des données fonctionne souvent de cette façon - alors c'est quelque chose que la réflexion pourrait faire pour vous automatiquement.

Les applications les plus courantes sont probablement ces trois-là :

  • La sérialisation (voir, par exemple, le module de sérialisation de .NET). XmlSerializer )
  • Génération de widgets pour l'édition des propriétés des objets (par exemple, le constructeur d'interface de Xcode, le concepteur de dialogue de .NET).
  • Les usines qui créent des objets avec des dépendances arbitraires en examinant les classes à la recherche de constructeurs et en fournissant des objets appropriés lors de la création (par exemple, tout cadre d'injection de dépendances).

2voto

Brian Agnew Points 143181

En utilisant la réflexion, vous pouvez très facilement écrire des configurations qui détaillent les méthodes/champs en texte, et le framework qui les utilise peut lire une description textuelle du champ et trouver le champ correspondant réel.

Par exemple, JXPath vous permet de naviguer dans les objets comme ceci :

//company[@name='Sun']/address

ainsi JXPath cherchera une méthode getCompany() (correspondant à company ), un champ de ce dernier appelé name etc.

Vous trouverez cela dans de nombreux frameworks en Java, par exemple JavaBeans, Spring, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X