Maison >Java >javaDidacticiel >Une brève introduction à la réflexion de base JavaRéflexion
La réflexion est l'une des fonctionnalités du langage de développement de programmes Java. Elle permet à un programme Java en cours d'exécution d'obtenir ses propres informations et d'accéder aux propriétés de l'objet Java au moment de l'exécution. , méthodes, constructeurs, etc.
Scénarios d'application
Développement de cadres universels - L'utilisation la plus importante de la réflexion est de développer divers cadres universels. Par exemple, Spring configure les JavaBeans, les filtres, etc. via des fichiers XML. Afin de garantir la polyvalence du framework, ils peuvent avoir besoin de charger différents objets ou classes et d'appeler différentes méthodes en fonction du fichier de configuration. être utilisé - le chargement dynamique au moment de l'exécution est requis. Proxy dynamique - En programmation d'aspect (AOP), il est nécessaire d'intercepter des méthodes spécifiques. Habituellement, la méthode du proxy dynamique est choisie. Annotation - L'annotation elle-même sert uniquement de marque. Elle doit utiliser le mécanisme de réflexion pour appeler l'interpréteur d'annotation en fonction de la marque d'annotation et exécuter le comportement. Sans réflexion, les annotations ne sont pas plus utiles que les annotations. Fonctionnalités d'extensibilité : les applications peuvent utiliser des classes externes définies par l'utilisateur en créant des instances d'objet d'extensibilité à l'aide de leurs noms complets. Inconvénients
Surcharge de performances - Les opérations réfléchissantes fonctionnent moins bien que les opérations non réfléchissantes et doivent être évitées dans les segments de code fréquemment appelés dans les applications sensibles aux performances. Rompre l'encapsulation : les contrôles d'autorisation peuvent être ignorés lors de l'appel de méthodes par réflexion, ce qui peut potentiellement rompre l'encapsulation et provoquer des problèmes de sécurité. Exposition interne : étant donné que la réflexion permet au code d'effectuer des opérations illégales dans du code non réfléchi, telles que l'accès à des champs et des méthodes privés, l'utilisation de la réflexion peut provoquer des effets secondaires involontaires, pouvant entraîner un dysfonctionnement du code et potentiellement interrompre la portabilité. Le code réfléchissant brise les abstractions et peut donc modifier le comportement à mesure que la plateforme est mise à niveau. Objet Classe
Pour utiliser la réflexion, il faut d'abord obtenir l'objet Classe correspondant à la classe sur laquelle opérer.
L'essence de la réflexion : au moment de l'exécution, divers attributs de chaque classe Java sont mappés en objets Java individuels.
Si le code suivant est défini :
User user = new User();
1 Lorsque la JVM charge la méthode et rencontre new User(), la JVM. le nom complet de l'utilisateur pour charger User.class ;
2. La JVM recherchera le fichier User.class sur le disque local et le chargera dans la mémoire JVM.
3. La JVM crée automatiquement l'objet Class correspondant à cette classe en appelant le chargeur de classe, et le stocke dans la zone méthode de la JVM.
Trois façons d'obtenir Class :
(1) Utiliser la méthode statique forName de la classe Class
Scénarios d'application
Développer un cadre général - réflexion est le plus important. L’objectif est de développer divers cadres généraux. Par exemple, Spring configure les JavaBeans, les filtres, etc. via des fichiers XML. Afin de garantir la polyvalence du framework, ils peuvent avoir besoin de charger différents objets ou classes et d'appeler différentes méthodes en fonction du fichier de configuration. être utilisé - le chargement dynamique au moment de l'exécution est requis. Proxy dynamique - En programmation d'aspect (AOP), il est nécessaire d'intercepter des méthodes spécifiques. Habituellement, la méthode du proxy dynamique est choisie. Annotation - L'annotation elle-même sert uniquement de marque. Elle doit utiliser le mécanisme de réflexion pour appeler l'interpréteur d'annotation en fonction de la marque d'annotation et exécuter le comportement. Sans réflexion, les annotations ne sont pas plus utiles que les annotations. Fonctionnalités d'extensibilité : les applications peuvent utiliser des classes externes définies par l'utilisateur en créant des instances d'objet d'extensibilité à l'aide de leurs noms complets. Inconvénients
Surcharge de performances - Les opérations réfléchissantes fonctionnent moins bien que les opérations non réfléchissantes et doivent être évitées dans les segments de code fréquemment appelés dans les applications sensibles aux performances. Rompre l'encapsulation : les contrôles d'autorisation peuvent être ignorés lors de l'appel de méthodes par réflexion, ce qui peut potentiellement rompre l'encapsulation et provoquer des problèmes de sécurité. Exposition interne : étant donné que la réflexion permet au code d'effectuer des opérations illégales dans du code non réfléchi, telles que l'accès à des champs et des méthodes privés, l'utilisation de la réflexion peut provoquer des effets secondaires involontaires, pouvant entraîner un dysfonctionnement du code et potentiellement interrompre la portabilité. Le code réfléchissant brise les abstractions et peut donc modifier le comportement à mesure que la plateforme est mise à niveau. Objet Classe
Pour utiliser la réflexion, il faut d'abord obtenir l'objet Classe correspondant à la classe sur laquelle opérer.
L'essence de la réflexion : au moment de l'exécution, divers attributs de chaque classe Java sont mappés en objets Java.
Si le code suivant est défini :
User user = new User();
1 Lorsque la JVM charge la méthode et rencontre new User(), la JVM. le nom complet de l'utilisateur pour charger User.class ;
2. La JVM recherchera le fichier User.class sur le disque local et le chargera dans la mémoire JVM.
3. La JVM crée automatiquement l'objet Class correspondant à cette classe en appelant le chargeur de classe, et le stocke dans la zone méthode de la JVM.
Trois façons d'obtenir Class :
(1) Utilisez la méthode statique forName de la classe Class
(2) Appelez la méthode getClass de l'objet
Reflection crée un objet instance
Utilisez la newInstance de la méthode objet Class. Utilisez la méthode newInstance de l'objet Constructor
Les interfaces et classes principales du package java.lang.reflect
Interface membre - réfléchissez à un seul membre (champ ou méthode) Ou les informations d'identification du constructeur. Classe Field - Fournit des informations sur les champs d'une classe et une interface pour accéder aux champs d'une classe. Classe de méthodes - Fournit des informations sur les méthodes d'une classe et une interface pour accéder aux méthodes de la classe. Classe Constructeur - Fournit des informations sur le constructeur d'une classe et une interface pour accéder au constructeur de la classe. Classe Array - Cette classe fournit des méthodes pour générer et accéder dynamiquement aux tableaux JAVA. Classe de modificateur - Fournit des méthodes statiques et des constantes pour décoder les modificateurs d'accès aux classes et aux membres. Classe proxy : fournit des méthodes statiques pour générer dynamiquement des classes proxy et des instances de classe.
[Cours recommandés : Cours liés à Java]
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!