Qu'est-ce que la réflexion et pourquoi est-il utile?
Ce qui est de la réflexion, et pourquoi est-il utile?
Je m'intéresse plus particulièrement à Java, mais je suppose que les principes sont les mêmes dans toutes les langues.
- Pour moi, c'est un moyen d'obtenir les noms de classe au moment de l'exécution et de la création d'objets de cette classe.
- parce que c'est une question populaire, je tiens à souligner que la réflexion (Sans annotations) doit être le dernier outil que vous aller lors de la résolution d'un problème. - Je l'utiliser et de l'amour, mais il annule tous les avantages de Java du typage statique. Si vous avez besoin d', l'isoler à un secteur aussi restreint que possible (d'Une méthode ou d'une classe). Il est plus acceptable pour les utiliser dans des tests de code de production. Avec des annotations elle doit être fine-Le point principal est de ne pas spécifier la classe ou la méthode des noms comme "Strings" si on peut l'éviter.
- voir aussi: softwareengineering.stackexchange.com/questions/123956/...
- En plus de @BillK commentaire: la Réflexion est très puissant, je l'appellerais de la magie. Avec un grand pouvoir vient une grande responsabilité. Utilisez-le seulement si vous savez ce que vous faites.
- Vous pouvez éviter de nombreux écueils impliqués dans la réflexion à l'aide de Collecteur
@Jailbreak
. Il fournit directement, type-safe accéder aux champs privés, des méthodes, etc. Laisser le compilateur Java en toute sécurité vérifier votre code et laissez Collecteur générer les sous-tendent la réflexion d'accès pour vous. En savoir plus: collecteur.systèmes/docs.html#type-safe-reflet
Vous devez vous connecter pour publier un commentaire.
Le nom de la réflexion est utilisé pour décrire le code qui est en mesure d'inspecter un autre code dans le même système (ou lui-même).
Par exemple, disons que vous avez un objet de type inconnu en Java, et vous souhaitez appeler un "doSomething' méthode si celle-ci existe. Java statique du système de typage n'est pas vraiment conçu pour l'appui de cette à moins que l'objet est conforme à une interface connue, mais l'utilisation de la réflexion, votre code peut ressembler à l'objet et savoir si il a une méthode appelée "doSomething' et ensuite l'appeler si vous le souhaitez.
Donc, pour vous donner un exemple de code de ce en Java (imaginez l'objet en question est toto) :
Un usage très courant en cas de Java est l'utilisation avec des annotations. JUnit 4, par exemple, utiliser la réflexion pour regarder à travers vos classes pour les méthodes taggés avec l'annotation @Test, et ensuite les appeler lors de l'exécution de l'unité de test.
Il y a quelques bons réflexion exemples pour vous obtenir ont commencé à http://docs.oracle.com/javase/tutorial/reflect/index.html
Et enfin, oui, les concepts sont à peu près similaires dans d'autres statique des types de langues, qui soutien à la réflexion (comme le C#). Dans typées dynamiquement langues, le cas d'utilisation décrit ci-dessus est moins nécessaire (puisque le compilateur va permettre à toute méthode doit être appelée à n'importe quel objet, à défaut lors de l'exécution si elle n'existe pas), mais le deuxième cas de la recherche de méthodes qui sont marqués ou de travailler dans une certaine manière, elle est encore fréquente.
Mise à jour à partir d'un commentaire:
Method
,Constructor
,Modifier
,Field
,Member
, fondamentalement, apparemment tous saufClass
) sont à l'intérieur de lajava.lang.*reflect*
paquet. Peut-être le concept de "réflexion" de manière exhaustive, comprend à la fois de type "introspection" et de modification au moment de l'exécution?ExpandoObject
Par exemple, tous les objets en Java ont la méthode
getClass()
, qui permet de déterminer la classe de l'objet, même si vous ne savez pas au moment de la compilation (par exemple, si vous avez déclaré comme unObject
) - cela peut sembler trivial, mais cette réflexion n'est pas possible à moins de langages dynamiques tels queC++
. Plus avancé utilise vous permet de liste et appeler des méthodes, constructeurs, etc.Réflexion est importante, car elle permet d'écrire des programmes qui n'ont pas de "savoir" tout ce au moment de la compilation, les rendant plus dynamique, car ils peuvent être attachés ensemble au moment de l'exécution. Le code peut être écrit contre connu des interfaces, mais les classes à utiliser peut être instancié en utilisant la réflexion à partir de fichiers de configuration.
Beaucoup de modernes des cadres d'utiliser la réflexion largement pour cette raison. La plupart des autres langues modernes utiliser la réflexion, et les langages de script (comme Python), ils sont encore plus étroitement intégré, car il se sent plus naturel dans le modèle de programmation de ces langues.
L'un de mes préférés utilise de réflexion est en dessous de Java méthode de vidage. Il prend l'objet en tant que paramètre et utilise la réflexion Java API pour imprimer chaque nom de champ et la valeur.
printDump(Object obj){ System.out.println(dump(obj, 0)); }
.Utilise de Réflexion
Réflexion est couramment utilisé par les programmes qui exige la capacité d'examiner ou de modifier le comportement d'exécution des applications en cours d'exécution dans la machine virtuelle Java. Ce qui est relativement fonctionnalité avancée et doit être utilisé uniquement par des développeurs qui ont une solide compréhension des principes de base de la langue. Avec cette mise en garde à l'esprit, la réflexion est une technique puissante qui permet des applications pour effectuer des opérations qui seraient autrement impossibles.
Fonctionnalités D'Extensibilité
Une application peut faire usage externe, classes définies par l'utilisateur en créant des instances de l'extensibilité des objets à l'aide de leurs noms qualifiés complets.
La classe des Navigateurs et des Environnements de Développement Visual
Un navigateur de classe doit être en mesure d'énumérer les membres de classes. Visual environnements de développement peuvent bénéficier de l'utilisation du type d'information disponible dans la réflexion pour aider le développeur dans l'écriture de code correct.
Les débogueurs et Outils de Test
Débogueurs besoin pour être en mesure d'examiner privée membres de les classes. Harnais de Test peuvent faire usage de la réflexion à demander systématiquement une découvrable ensemble Api définies sur une classe, afin d'assurer un niveau élevé de couverture de code dans une suite de tests.
Inconvénients de Réflexion
Réflexion est puissant, mais ne doit pas être utilisé sans discernement. Si il est possible d'effectuer une opération sans l'aide de la réflexion, il est préférable d'éviter de l'utiliser. Les aspects suivants doivent être gardés à l'esprit lors de l'accès à code par la réflexion.
Parce que la réflexion implique des types qui sont dynamiquement résolu, certains de la machine virtuelle Java optimisations ne peut pas être effectuée. Par conséquent, réfléchissant opérations baisse des performances de leur non-réfléchissant homologues et doit être évitée dans les sections de code qui sont appelés fréquemment dans les performances des applications sensibles.
Réflexion nécessite un temps d'exécution de l'autorisation qui ne peut être présent lors de l'exécution en vertu d'un gestionnaire de sécurité. Ceci est une considération importante pour le code qui doit s'exécuter dans une mesure limitée contexte de sécurité, comme dans une Applet.
Depuis la réflexion permet code pour effectuer des opérations qui seraient illégales au non-réfléchissant code, telles que l'accès aux champs privés et des méthodes, l'utilisation de la réflexion, peut entraîner des effets secondaires inattendus, ce qui peut rendre le code de dysfonctionnements et peut détruire la portabilité. Réfléchissant code des pauses abstractions et, par conséquent, peuvent changer de comportement avec les mises à niveau de la plate-forme.
source: L'API Reflection
Réflexion est un mécanisme clé pour permettre à une application ou d'un cadre de travail avec un code qui ne pourrait pas avoir été encore écrit!
Prendre pour exemple typique de votre web.xml fichier. Il contient une liste de servlet éléments, qui contiennent imbriquée servlet-class éléments. Le conteneur de servlet sera procédé à la web.xml fichier, et de créer une nouvelle instance de chaque classe de servlet par la réflexion.
Un autre exemple serait la Java API for XML Parsing (JAXP). Où un analyseur XML fournisseur est "branché" par la bien connue des propriétés du système, qui sont utilisés pour construire de nouvelles instances par le biais de la réflexion.
Et enfin, le plus complet exemple est Printemps qui utilise la réflexion pour créer ses grains, et pour sa forte utilisation de procurations
Pas tous la langue prend en charge la réflexion, mais les principes sont généralement les mêmes dans les langues qui le prennent en charge.
La réflexion est la capacité à "réfléchir" sur la structure de votre programme. Ou plus concrète. Pour regarder les objets et les classes que vous avez et obtenir par programme de retour d'informations sur les méthodes, les champs, et les interfaces ils mettent en œuvre. Vous pouvez aussi regarder les choses comme les annotations.
Il est utile dans beaucoup de situations. Partout où vous voulez être en mesure de dynamiquement plug dans les classes dans votre code. Beaucoup de objet-relationnel mappeurs utiliser la réflexion pour être en mesure d'instancier des objets de bases de données sans savoir à l'avance quels sont les objets qu'ils vont utiliser. Plug-in architectures est un autre endroit où la réflexion est utile. Être en mesure de charger dynamiquement du code et de déterminer si il y a des types qui mettent en œuvre le droit de l'interface pour l'utiliser comme un plugin est important dans ces situations.
Réflexion permet l'instanciation de nouveaux objets, l'invocation de méthodes, et obtenir/définir des opérations sur les variables de classe dynamiquement au moment de l'exécution, sans avoir une connaissance préalable de sa mise en œuvre.
Dans l'exemple ci-dessus, le paramètre null est l'objet que vous voulez appeler la méthode sur. Si la méthode est statique, vous offre null. Si la méthode n'est pas statique, tout en invoquant vous devez fournir un valide MyObject exemple au lieu de null.
Réflexion vous permet également d'accéder membre privé/les méthodes d'une classe:
.
java.lang.reflect
). Les métadonnées de la classe peuvent être accessibles par le biais dejava.lang.Class
.La réflexion est un très puissant API, mais il peut ralentir l'application si utilisé en excès, qu'il n'en résout tous les types à l'exécution.
Réflexion Java est très puissant et peut être très utile.
Java Réflexion permet pour inspecter les classes, les interfaces, les champs et les méthodes d'exécution, sans connaître les noms des classes, des méthodes, etc. au moment de la compilation.
Il est également possible de instancier de nouveaux objets, d'invoquer des méthodes et d'obtenir/définir des valeurs de champ à l'aide de la réflexion.
Une rapide Réflexion Java exemple pour vous montrer ce que l'utilisation de la réflexion ressemble:
Cet exemple obtient l'objet de Classe de la classe appelée MyObject. L'utilisation de la classe de l'objet de l'exemple permet d'obtenir une liste des méthodes de la classe, réitère les méthodes et imprimer leurs noms.
Exactement comment tout cela fonctionne est expliqué ici
Modifier: Après presque 1 an, je suis l'édition de cette réponse que lors de la lecture de la réflexion j'ai eu plusieurs utilisations de la Réflexion.
Au Printemps lorsque le contexte des processus de ce < bean > élément, il va utiliser la Classe.forName(String) avec l'argument "com.exemple.Foo" pour instancier cette Classe.
Il sera alors de nouveau utiliser la réflexion pour obtenir les setter pour le < propriété > élément et définissez sa valeur à la valeur spécifiée.
Pour les méthodes Privées,
Pour les champs privés,
Exemple:
Prendre pour exemple une application à distance qui permet à votre application d'un objet que vous pouvez obtenir l'aide de leurs Méthodes de l'API . Désormais basées sur l'objet que vous pourriez avoir besoin pour effectuer un type de calcul .
Le fournisseur garantit que l'objet peut être de 3 types, et nous avons besoin d'effectuer le calcul en fonction du type d'objet .
De sorte que nous pourrions mettre en œuvre en 3 classes contenant chacune une logique différente .Évidemment, l'objet de l'information est disponible dans l'exécution afin que vous ne pouvez pas statique de code pour effectuer le calcul d'où la réflexion est utilisé pour instancier l'objet de la classe dont vous avez besoin pour effectuer le calcul en fonction de l'objet reçu de la part du fournisseur .
instanceof
pour déterminer le type de l'objet au moment de l'exécution?Réflexion est une API qui est utilisé pour interroger ou de modifier le comportement de méthodes, classes, interfaces au moment de l'exécution.
java.lang.reflect package
.La
java.lang
etjava.lang.reflect
paquets fournissent des classes java pour la réflexion.Réflexion peut être utilisé pour obtenir des informations sur –
Classe La
getClass()
méthode est utilisée pour obtenir le nom de la classe à laquelle appartient un objet.Constructeurs La
getConstructors()
méthode est utilisée pour obtenir le public, les constructeurs de la classe à laquelle appartient un objet.Méthodes La
getMethods()
méthode est utilisée pour obtenir les méthodes publiques de la classe à laquelle un objet appartient.La API Reflection est principalement utilisé dans:
IDE (Environnement de Développement Intégré), comme par exemple Eclipse, MyEclipse, NetBeans ...
Débogueur et Outils de Test etc.
Avantages de l'Utilisation de la Réflexion:
Fonctionnalités d'extensibilité: Une application peut faire usage externe, classes définies par l'utilisateur en créant des instances de l'extensibilité des objets à l'aide de leurs noms qualifiés complets.
De débogage et de test des outils: Débogueurs utiliser la propriété de réflexion pour examiner privée membres de les classes.
Inconvénients:
Surcharge de Performance: Réfléchissant opérations baisse des performances de leur non-réfléchissant homologues, et doit être évitée dans les sections de code qui sont appelés fréquemment dans les performances des applications sensibles.
De l'exposition interne: Réfléchissant code des pauses abstractions et, par conséquent, peuvent changer le comportement des mises à niveau de la plate-forme.
Ref: Réflexion Java javarevisited.blogspot.dans
Exemple Simple pour la réflexion.
Dans un jeu d'échecs, vous ne savez pas ce qui va être déplacé par l'utilisateur au moment de l'exécution. la réflexion peut être utilisé pour appeler des méthodes qui sont déjà mises en œuvre au moment de l'exécution:
Selon ma compréhension:
Réflexion permet au programmeur de l'accès des entités dans le programme de façon dynamique. c'est à dire lors de l'encodage d'une demande si le programmeur n'est au courant à propos d'une classe ou de ses méthodes, il peut faire usage de cette classe de manière dynamique (à l'exécution) par l'aide de la réflexion.
Il est fréquemment utilisé dans les cas où un nom de classe à de fréquents changements. Si une telle situation se produit, alors c'est compliqué pour le programmeur de réécrire l'application et modifier le nom de la classe, encore et encore.
Au lieu de cela, par l'aide de la réflexion, il n'est besoin de s'inquiéter d'un éventuel changement de nom de la classe.
La réflexion est un ensemble de fonctions qui vous permet d'accéder aux informations d'exécution de votre programme et de le modifier le comportement (avec certaines limitations).
C'est utile parce qu'il permet de changer le moteur d'exécution behaivour selon les méta-informations de votre programme, vous pouvez vérifier le type de retour d'une fonction et de changer la façon dont vous gérer la situation.
En C# par exemple, vous pouvez charger un assembly (un .dll) lors de l'exécution d'un de l'examiner, de la navigation au travers de cours et de prendre des mesures en fonction de ce que vous avez trouvé. Il vous permet également de créer une instance d'une classe sur l'exécution, invoquer sa méthode, etc.
Où peut-elle être utile? N'est pas utile, à chaque fois, mais pour des situations concrètes. Par exemple, vous pouvez l'utiliser pour obtenir le nom de la classe pour loggin fins, à dinamically créer des gestionnaires d'événements pour les événements en fonction de ce qui est spécifié sur un fichier de configuration et ainsi de suite...
Réflexion est de laisser l'objet à voir leur apparence. Cet argument ne semble rien à voir avec la réflexion. En fait, c'est le "s'identifier" la capacité.
La réflexion elle-même est un mot pour les langues telles que le manque de la capacité de la connaissance de soi et l'auto-détection comme Java et C#. Parce qu'ils n'ont pas la capacité de connaissance de soi, lorsque l'on veut observer comment il ressemble, nous devons avoir une autre chose à réfléchir sur la façon dont il ressemble. Excellent langages dynamiques tels que Ruby et Python, il est possible de percevoir le reflet de leur propre sans l'aide d'autres personnes. Nous pouvons dire que l'objet de Java ne pas voir à quoi ça ressemble sans un miroir, qui est un objet de la réflexion de la classe, mais un objet en Python peut la percevoir sans miroir. C'est pourquoi nous avons besoin de réflexion en Java.
Je veux juste ajouter un point à tout ce qui a été répertorié.
Avec API Reflection vous pouvez écrire universelle
toString()
méthode pour n'importe quel objet.Il est utile pour le débogage.
Voici quelques exemple:
De documentation de java page
AccessibleObject
permet la suppression des contrôles d'accès si nécessaireReflectPermission
est disponible.Les Classes de ce package, avec
java.lang.Class
accueillir des applications telles que des débogueurs, des interprètes, objet d'inspecteurs, de la classe des navigateurs, et des services tels queObject Serialization
etJavaBeans
qui ont besoin de droits d'accès au public et les membres d'un objet cible (en fonction de sa classe d'exécution) ou les membres déclarés par une classe donnéeIl comprend les fonctionnalités suivantes.
Jetez un oeil à cette la documentation lien pour les méthodes exposées par
Class
classe.De cette l'article (par Dennis Sosnoski, Président, Sosnoski Software Solutions, Inc) et ce l'article (sécurité-explorations pdf):
Je vois beaucoup d'inconvénients que d'utilisations de l'utilisation de la Réflexion
Utilisateur de Réflexion:
Inconvénients de Réflexion:
que l'accès aux données de la protection et de sécurité de type
Général abus:
Jetez un oeil à cette question SE rapportant à l'abus de la réflexion fonctionnalité:
Comment puis-je lire un domaine privé en Java?
Résumé:
Insécurité utilisation de ses fonctions réalisées à partir de l'intérieur d'un système de code peut aussi facilement conduire à la compromission de la sécurité de Java en model'. Donc utiliser cette fonction avec parcimonie
Que le nom lui-même suggère qu'il reflète ce qu'il détient par exemple de la méthode de classe,etc en plus de fournir une fonction à appeler la méthode de la création de l'instance dynamiquement à l'exécution.
Il est utilisé par de nombreux cadres et de l'application sous le bois pour appeler des services sans réellement connaître le code.
Réflexion vous donne la possibilité d'écrire plus de code générique. Il vous permet de créer un objet au moment de l'exécution et appeler sa méthode au moment de l'exécution. D'où le programme peut être hautement paramétrable. Il permet également à l'introspection de l'objet et de classe afin de détecter ses variables et la méthode exposée à l'extérieur du monde.
Reflection
a beaucoup de utilise. La je suis plus familier avec, est d'être en mesure de créer un code à la volée.Je veux répondre à cette question, par exemple. Tout d'abord
Hibernate
projet utiliseReflection API
pour générerCRUD
déclarations à combler le fossé entre l'exécution de l'application et de la persistance. Lorsque les choses changent dans le domaine, leHibernate
a à savoir sur eux, de les conserver à la banque de données et vice versa.Sinon œuvres
Lombok Project
. Il a juste injecte du code lors de la compilation, le résultat dans le code insérés dans les classes de votre domaine. (Je crois que c'est OK pour les getters et setters)Hibernate
choisireflection
parce qu'il a peu d'impact sur le processus de construction d'une application.Et à partir de Java 7, nous avons
MethodHandles
, qui fonctionne commeReflection API
. Dans les projets, de travailler avec des enregistreurs de nous il suffit de copier-coller le code suivant:Parce qu'il est difficile de faire des fautes de frappe-erreur dans ce cas.
Que je trouve qu'il vaut mieux expliquer, par exemple, et aucune des réponses ne semblent que...
Un exemple pratique de l'utilisation des reflets serait un Langage Java Serveur écrit en Java ou en PHP, Langage Serveur, écrit en PHP, etc. Language Server donne à votre IDE capacités comme la saisie semi-automatique, saut à la définition, le contexte de l'aide, faisant allusion types et plus. Afin d'avoir tous les noms de balises (mots qui peut être complété automatiquement) pour afficher toutes les correspondances possibles que vous tapez le Langage Serveur doit inspecter tout au sujet de la classe, y compris doc blocs et les membres privés. Pour cela, il a besoin d'une réflexion de ladite classe.
Un autre exemple serait une unité de test d'une méthode privée. Une façon de le faire est de créer une réflexion et un changement de la méthode de portée du public dans le test set-up de phase. Bien sûr, on peut argumenter méthodes privées ne devraient pas être testé directement, mais qui n'est pas le point.