logo

API de réflexion Java

Réflexion Java est un processus d'examen ou de modification du comportement d'exécution d'une classe au moment de l'exécution .

Le java.lang.Class La classe fournit de nombreuses méthodes qui peuvent être utilisées pour obtenir des métadonnées, examiner et modifier le comportement d'exécution d'une classe.

Les packages java.lang et java.lang.reflect fournissent des classes pour la réflexion Java.

Où il est utilisé

L'API Reflection est principalement utilisée dans :

  • IDE (Integrated Development Environment), par exemple Eclipse, MyEclipse, NetBeans, etc.
  • Débogueur
  • Outils de tests, etc.
Savez-vous?
  • De combien de façons pouvons-nous obtenir l’instance de la classe Class ?
  • Comment créer l'outil javap ?
  • Comment créer l'outil appletviewer ?
  • Comment accéder à la méthode privée depuis l’extérieur de la classe ?

classe java.lang.Class

La classe java.lang.Class effectue principalement deux tâches :

  • fournit des méthodes pour obtenir les métadonnées d’une classe au moment de l’exécution.
  • fournit des méthodes pour examiner et modifier le comportement d’exécution d’une classe.

Méthodes couramment utilisées de la classe Class :

MéthodeDescription
1) chaîne publique getName()renvoie le nom de la classe
2) La classe statique publique forName (String className) lance une exception ClassNotFoundExceptioncharge la classe et renvoie la référence de la classe Class.
3) l'objet public newInstance() lance InstantiationException,IllegalAccessExceptioncrée une nouvelle instance.
4) isInterface booléenne publique()vérifie s'il s'agit d'une interface.
5 ) isArray booléen public ( ) ;vérifie s'il s'agit d'un tableau.
6) le booléen public isPrimitive()vérifie s'il est primitif.
7) Classe publique getSuperclass()renvoie la référence de classe superclasse.
8) public Field[] getDeclaredFields() lance SecurityExceptionrenvoie le nombre total de champs de cette classe.
9) public Method[] getDeclaredMethods() lance SecurityExceptionrenvoie le nombre total de méthodes de cette classe.
10) public Constructor[] getDeclaredConstructors() lance SecurityExceptionrenvoie le nombre total de constructeurs de cette classe.
11) La méthode publique getDeclaredMethod (nom de chaîne, classe [] paramètreTypes) renvoie NoSuchMethodException, SecurityExceptionrenvoie l'instance de classe de méthode.

Comment obtenir l’objet de la classe Class ?

Il existe 3 façons d’obtenir l’instance de la classe Class. Ils sont les suivants :

  • Méthode forName() de la classe Class
  • Méthode getClass() de la classe Object
  • la syntaxe .class

1) méthode forName() de la classe Class

  • est utilisé pour charger la classe dynamiquement.
  • renvoie l'instance de la classe Class.
  • Il doit être utilisé si vous connaissez le nom complet de la classe. Cela ne peut pas être utilisé pour les types primitifs.

Voyons l'exemple simple de la méthode forName().

Nom de fichier: Test.java

 class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } } 

Sortir:

 Simple 

2) Méthode getClass() de la classe Object

Il renvoie l’instance de la classe Class. Il doit être utilisé si vous connaissez le type. De plus, il peut être utilisé avec des primitives.

Nom de fichier: Test.java

 class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } } 

Sortir:

Simple 

3) La syntaxe .class

Si un type est disponible, mais qu'il n'y a pas d'instance, alors il est possible d'obtenir une classe en ajoutant « .class » au nom du type. Il peut également être utilisé pour les types de données primitifs.

Nom de fichier: Test.java

quelle est la taille de mon écran
 class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } } 

Sortir:

 boolean Test 

Détermination de l'objet de classe

Les méthodes suivantes de la classe Class sont utilisées pour déterminer l'objet de classe :

1) isInterface booléenne publique() : détermine si l'objet Class spécifié représente un type d'interface.

2) isArray booléen public() : détermine si cet objet Class représente une classe de tableau.

3) public booléen isPrimitive() : détermine si l'objet Class spécifié représente un type primitif.

Voyons l'exemple simple de l'API de réflexion pour déterminer le type d'objet.

Nom de fichier: Test.java

 class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } } 

Sortir:

 false true 

Avantages et inconvénients de la réflexion

La réflexion Java doit toujours être utilisée avec prudence. Si la réflexion présente de nombreux avantages, elle présente également certains inconvénients. Discutons d'abord des avantages.

Avantages: L'inspection des interfaces, des classes, des méthodes et des champs pendant l'exécution est possible grâce à la réflexion, même sans utiliser leurs noms pendant la compilation. Il est également possible d'appeler des méthodes, d'instancier un clear ou de définir la valeur des champs par réflexion. Il aide à la création d'environnements de développement visuels et de navigateurs de classes qui aident les développeurs à écrire le code correct.

Les inconvénients: En utilisant la réflexion, on peut briser les principes de l'encapsulation. Il est possible d'accéder aux méthodes et champs privés d'une classe par réflexion. Ainsi, la réflexion peut divulguer des données importantes vers le monde extérieur, ce qui est dangereux. Par exemple, si l'on accède aux membres privés d'une classe et lui attribue une valeur nulle, alors l'autre utilisateur de la même classe peut obtenir l'exception NullReferenceException, et ce comportement n'est pas attendu.

Un autre inconvénient est la surcharge de performance. Étant donné que les types en réflexion sont résolus dynamiquement, l’optimisation JVM (Java Virtual Machine) ne peut pas avoir lieu. Par conséquent, les opérations effectuées par les réflexions sont généralement lentes.

Conclusion

En raison des inconvénients mentionnés ci-dessus, il est généralement conseillé d’éviter d’utiliser la réflexion. Il s’agit d’une fonctionnalité avancée qui ne doit être utilisée que par des programmeurs ou des développeurs ayant une bonne connaissance des bases du langage. Toujours se rappeler! Chaque fois que la réflexion est utilisée, la sécurité de l'application est compromise.


Sujets suivants du didacticiel de l'API Reflection

Méthode newInstance()
Comprendre l'outil Javap
création d'un outil javap
création d'un outil de visualisation d'applet
Appeler une méthode privée d'une autre classe