Maîtriser la réflexion Java : inspection des classes, méthodes et champs à l'exécution
Maîtriser la réflexion Java
Apprenez comment l'API de réflexion de Java permet d'inspecter et modifier classes, méthodes, champs et constructeurs pendant l'exécution, améliorant la flexibilité et permettant des comportements dynamiques puissants.
En Java, la réflexion vous permet d'examiner et manipuler classes, interfaces, constructeurs, méthodes et champs pendant que le programme s'exécute.
Java fournit la classe Class, qui encapsule les métadonnées sur une classe ou interface. Une instance de Class est la passerelle vers les capacités de réflexion.
Obtenir un objet Class
Pour effectuer de la réflexion, vous avez d'abord besoin d'un objet Class. Il y a trois façons courantes de l'obtenir :
- Utiliser
Class.forName()Class<Dog> clazz = Class.forName("com.example.Dog");La méthode accepte le nom de classe pleinement qualifié et charge la classe si elle ne l'est pas déjà.
- Utiliser
getClass()sur une instanceDog dog = new Dog(); Class<Dog> clazz = dog.getClass();Récupère la classe d'exécution de l'objet.
- Utiliser le littéral
.classClass<Dog> clazz = Dog.class;Fournit une référence au moment de la compilation à l'objet
Class.
Une fois que vous avez une instance de Class, vous pouvez interroger ses méthodes, champs, constructeurs et annotations.
Exemple pratique : Inspection de la classe Dog
import java.lang.Class; import java.lang.reflect.*; class Animal {} public class Dog extends Animal { public void display() { System.out.println("I am a dog."); } } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Class<Dog> clazz = dog.getClass(); System.out.println("Name: " + clazz.getName()); System.out.println("Modifier: " + Modifier.toString(clazz.getModifiers())); System.out.println("Superclass: " + clazz.getSuperclass().getName()); } catch (Exception e) { e.printStackTrace(); } } }
Sortie
Name: com.example.Dog Modifier: public Superclass: com.example.Animal
Dans cet extrait, nous avons créé une instance Dog, obtenu son objet Class, et interrogé le nom de classe, le modificateur d'accès et la superclasse.
Pour plus de détails sur Class, consultez la documentation officielle Java Class.
Exploration des champs, méthodes et constructeurs
Le package java.lang.reflect offre des classes dédiées pour introspecter des membres spécifiques :
Method– détails sur les méthodes.Field– détails sur les champs.Constructor– détails sur les constructeurs.
Réflexion sur les méthodes
La classe Method expose des métadonnées comme le nom, le type de retour et les modificateurs. Voici un exemple concis :
import java.lang.reflect.*; class Dog { public void display() { System.out.println("I am a dog."); } private void makeSound() { System.out.println("Bark Bark"); } } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Method[] methods = dog.getClass().getDeclaredMethods(); for (Method m : methods) { System.out.println("Method Name: " + m.getName()); System.out.println("Modifier: " + Modifier.toString(m.getModifiers())); System.out.println("Return Type: " + m.getReturnType()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
Sortie
Method Name: display Modifier: public Return Type: void Method Name: makeSound Modifier: private Return Type: void
Pour une liste complète des utilitaires Method, visitez la documentation officielle Method.
Réflexion sur les champs
Les champs peuvent être accédés et modifiés à l'exécution. La classe Field fournit get, set et des utilitaires de modificateurs. Exemple :
import java.lang.reflect.*; class Dog { public String type; private String color; } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Class<Dog> clazz = dog.getClass(); // Champ public Field typeField = clazz.getField("type"); typeField.set(dog, "labrador"); System.out.println("Value: " + typeField.get(dog)); System.out.println("Modifier: " + Modifier.toString(typeField.getModifiers())); // Champ privé Field colorField = clazz.getDeclaredField("color"); colorField.setAccessible(true); colorField.set(dog, "brown"); System.out.println("Value: " + colorField.get(dog)); System.out.println("Modifier: " + Modifier.toString(colorField.getModifiers())); } catch (Exception e) { e.printStackTrace(); } } }
Sortie
Value: labrador Modifier: public Value: brown Modifier: private
Explorez la documentation de la classe Field pour une utilisation avancée.
Réflexion sur les constructeurs
Les constructeurs sont introspectés via la classe Constructor. Le code suivant liste tous les constructeurs de Dog :
import java.lang.reflect.*; class Dog { public Dog() {} private Dog(int age) {} } public class Main { public static void main(String[] args) { try { Constructor<Dog>[] cons = Dog.class.getDeclaredConstructors(); for (Constructor<Dog> c : cons) { System.out.println("Constructor Name: " + c.getName()); System.out.println("Modifier: " + Modifier.toString(c.getModifiers())); System.out.println("Parameters: " + c.getParameterCount()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
Sortie
Constructor Name: Dog Modifier: public Parameters: 0 Constructor Name: Dog Modifier: private Parameters: 1
Pour plus de détails, voir la documentation Constructor.
Java
- Comprendre le mot-clé final en Java : variables, méthodes et classes
- L'opérateur instanceof en Java : guide complet
- Maîtriser l'héritage Java : concepts, types et exemples pratiques
- Comprendre les classes imbriquées statiques en Java : utilisation, différences et exemples
- Maîtriser les classes internes anonymes en Java : définition, syntaxe et exemples pratiques
- Le pattern Singleton en Java expliqué : implémentation et utilisation sûre
- Maîtriser Java ObjectOutputStream : Sérialisation, méthodes et exemples pratiques
- Maîtriser les génériques Java : Construire du code réutilisable et type-safe
- Maîtriser les opérations sur les fichiers Java avec java.io – Création, lecture, écriture et suppression