Résumé des connaissances sur la réflexion Java (mise à jour)

1. Qu'est-ce que la réflexion ?

La réflexion est en cours d'exécution. Pour n'importe quelle classe, vous pouvez connaître toutes les propriétés et méthodes de cette classe ; pour n'importe quel objet, vous pouvez appeler n'importe laquelle de ses méthodes et propriétés ; La fonction de la méthode est appelée le mécanisme de réflexion de Java langue.

Le principe sous-jacent :
trouver la classe instanceKlass écrite en C++ dans le métaspace dans la zone de méthode via le pointeur vers le bytecode de la classe dans l'en-tête de l'objet, obtenir les informations de type, puis obtenir l'objet de classe dans le tas en fonction de l'attribut javamirror qu'il contient , puis utilisez l'attribut et la méthode pour manipuler l'objet.

2. Où le mécanisme de réflexion est-il utilisé ?

Dans JDBC, le pilote de base de données est chargé dynamiquement à l'aide de la réflexion.
La méthode de service de la servlet est invoquée par réflexion dans le serveur Web.
Les outils de développement tels qu'Idea utilisent la réflexion pour analyser dynamiquement le type et la structure des objets, et inviter dynamiquement les propriétés et les méthodes des objets.
De nombreux frameworks utilisent le mécanisme de réflexion pour injecter des propriétés et appeler des méthodes, telles que Spring.

3. Qu'est-ce que la sérialisation d'objet, qu'est-ce que la désérialisation et que faut-il faire pour réaliser la sérialisation d'objet ?

Sérialisation d'objet, le processus d'encodage des données dans un objet sous la forme d'une séquence d'octets.
Désérialisation ; le processus de désembrouillage des octets encodés d'un objet dans un objet.
JAVA fournit des API pour réaliser la sérialisation et la désérialisation des objets. Lors de l'utilisation de ces API, les conventions suivantes doivent être suivies : le
type d'objet sérialisé doit implémenter l'interface de sérialisation, qui est une interface d'indicateur et ne déclare aucune méthode abstraite. , le compilateur JAVA reconnaît cette interface et ajoute automatiquement des méthodes de sérialisation et de désérialisation à cette classe.
Afin de maintenir la stabilité du processus de sérialisation, il est recommandé d'ajouter un numéro de version de sérialisation à la classe.
Si vous ne souhaitez pas que les champs soient placés sur le disque dur,
vous devez utiliser la sérialisation Java dans les situations suivantes :
lorsque vous souhaitez enregistrer l'état de l'objet en mémoire dans un fichier ou dans une base de données ; lorsque vous
souhaitez utiliser sockets pour transmettre des objets sur le réseau ;
Lors du transfert d'objets via RMI (Remote Method Invocation).

4. Quels sont les avantages et les inconvénients du mécanisme de réflexion ?

Avantages : Il peut être exécuté dynamiquement, exécuter dynamiquement des méthodes et accéder aux attributs en fonction des fonctions métier pendant le fonctionnement, et maximiser la flexibilité de Java.
défaut:

  1. Surcharge de performances supplémentaire (Performance Overhead) : étant donné que la réflexion implique une résolution de type dynamique, elle ne peut pas effectuer certaines optimisations de machine virtuelle Java, de sorte que les performances des opérations réflexives sont généralement plus lentes que les opérations non réflexives.
  2. Restrictions de sécurité (Restrictions de sécurité) : Reflection nécessite des autorisations d'opération d'exécution, qui peuvent ne pas être autorisées par certains gestionnaires de sécurité.
  3. Exposition des composants internes : étant donné que la réflexion permet au code de faire des choses qui sont illégales dans le code non réfléchi (comme l'accès à des champs et à des méthodes privés), l'utilisation de la réflexion peut entraîner des effets secondaires imprévus qui peuvent empêcher le code de fonctionner correctement et potentiellement interrompre la portabilité. Le code réfléchissant brise l'abstraction, de sorte que le comportement peut changer avec les mises à niveau de la plate-forme.

5. Qu'est-ce qu'un proxy dynamique ? Quelles sont les candidatures ?

Un proxy dynamique est une classe de proxy générée dynamiquement lors de l'exécution.
L'application du proxy dynamique comprend la requête de données Spring AOP, la maquette back-end du framework de test, le rpc, l'acquisition d'objets d'annotation Java, etc.

6. Comment mettre en place un proxy dynamique ?

Proxy dynamique natif JDK et proxy dynamique cglib.
Le proxy dynamique natif de JDK est implémenté sur la base d'interfaces, tandis que cglib est implémenté sur la base de sous-classes qui héritent de la classe actuelle.

7. Le rôle du mécanisme de réflexion Java

Déterminer la classe de n'importe quel objet
à l'exécution Construire l'objet de n'importe quelle classe
à l'exécution Déterminer les variables membres et les méthodes de n'importe quelle classe
à l'exécution Appeler la méthode de n'importe quel objet à l'exécution

8. Comment utiliser la réflexion Java ?

Créez un objet Class.forName("full class name"); par exemple : com.mysql.jdbc.Driver La classe Driver a été chargée dans la jvm et l'initialisation de la classe
est terminée.
> objet clz
Object.getClass();
Obtenir l'objet constructeur et créer un objet via le nouveau constructeur
Clazz.getConstructor([String.class]);
Con.newInstance([paramètre]);
Créer un objet instance via l'objet classe (juste Équivalent au nouveau nom de classe (pas de constructeur de paramètres)
Cls.newInstance();
Obtenir un objet d'attribut via l'objet de classe
Champ c=cls.getFields() : Obtenir tous les champs publics (publics) d'une certaine classe, y compris le parent champs de la classe.
Champ c=cls.getDeclaredFields() : Obtient tous les champs déclarés d'une certaine classe, y compris public, privé et protégé, mais n'incluant pas les champs déclarés de la classe parente Obtient un objet de méthode via l'objet de classe Cls.getMethod("nom de la
méthode
" ,class...parameaType); (seuls les publics peuvent être obtenus)
Cls.getDeclareMethod("nom de la méthode"); (pour obtenir des méthodes modifiées arbitraires, les méthodes privées ne peuvent pas être exécutées)
M.setAccessible(true); (pour rendre privé méthodes exécutables)
Laissez la méthode s'exécuter
1). Method.invoke (objet d'instance obj, paramètres de variable obj); ----- (a une valeur de retour)

Guess you like

Origin blog.csdn.net/weixin_44313315/article/details/130465051