0Pricing
Java Academy · Leçon

Appeler des méthodes et accéder aux champs

Appelez des méthodes privées et définissez des champs inaccessibles avec Method.invoke et Field.set, en utilisant setAccessible.

Appeler des méthodes et accéder aux champs est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.

setAccessible : contourner la visibilité

Appelez field.setAccessible(true) ou method.setAccessible(true) pour contourner le contrôle d’accès de Java. Cette opération est nécessaire pour les membres privés. Elle nécessite un accès approprié aux modules dans Java 9 et les versions ultérieures.

Field f = User.class.getDeclaredField("name");
f.setAccessible(true);
User u = new User("Alice", 30);
System.out.println(f.get(u));  // "Alice"
f.set(u, "Bob");               // mutate the private field
System.out.println(u.getName()); // "Bob"

Lire les valeurs des champs

Utilisez field.get(instance) pour lire la valeur de n’importe quel champ, avec emballage pour les types primitifs. Pour les champs statiques, transmettez null comme instance.

Field f = MyClass.class.getDeclaredField("count");
f.setAccessible(true);
int count = (int) f.get(null); // static field → null instance

Définir les valeurs des champs

Utilisez field.set(instance, value) pour écrire dans un champ. Le type de la valeur doit correspondre ou pouvoir être déballé automatiquement. Modifier par réflexion un champ final produit un comportement non défini dans les JVM modernes.

Field nameField = User.class.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(user, "Charlie");

Appeler des méthodes par réflexion

Récupérez un objet Method, appelez setAccessible(true), puis invoquez-le avec method.invoke(instance, args...). La valeur renvoyée est un objet Object.

Method greet = User.class.getDeclaredMethod("greet", String.class);
greet.setAccessible(true);
String result = (String) greet.invoke(user, "World");
System.out.println(result);

Gérer InvocationTargetException

Si la méthode appelée lève une exception, la réflexion l’enveloppe dans InvocationTargetException. Désencapsulez-la avec getCause().

try {
    method.invoke(obj, args);
} catch (InvocationTargetException e) {
    Throwable cause = e.getCause();
    System.err.println("Method threw: " + cause.getMessage());
} catch (IllegalAccessException | NoSuchMethodException e) {
    System.err.println("Reflection error: " + e.getMessage());
}

Appeler des méthodes statiques

Transmettez null comme argument d’instance lorsque vous appelez des méthodes statiques.

Method parseInt = Integer.class.getDeclaredMethod("parseInt", String.class);
int value = (int) parseInt.invoke(null, "42"); // null = static
System.out.println(value); // 42

Créer des instances avec un constructeur

Obtenez un Constructor, appelez setAccessible(true) pour les constructeurs privés, puis utilisez newInstance(args...).

Constructor<User> ctor = User.class.getDeclaredConstructor(String.class, int.class);
ctor.setAccessible(true);
User u = ctor.newInstance("Diana", 28);
System.out.println(u);

La réflexion dans les cadres applicatifs : DI de Spring

Spring utilise la réflexion pour instancier les composants et injecter les dépendances. Il appelle les constructeurs privés et définit les champs privés pour configurer le contexte de l’application.

Accès aux modules dans Java 9 et les versions ultérieures

Dans Java 9 et les versions ultérieures, les modules restreignent setAccessible par défaut. Si la classe se trouve dans un module nommé, vous devrez peut-être ouvrir le paquetage : --add-opens java.base/java.lang=ALL-UNNAMED.

// JVM flag to open a package for reflection:
// --add-opens java.base/java.lang=ALL-UNNAMED

MethodHandles : une alternative plus rapide

MethodHandles.lookup().findVirtual() fournit l’appel réflexif de méthodes avec des performances proches d’un appel direct après l’optimisation du JIT. Cette approche est à privilégier dans le code de bibliothèque critique en matière de performances.

MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(User.class, MethodHandles.lookup());
MethodHandle handle = lookup.findVirtual(User.class, "getName", MethodType.methodType(String.class));
String name = (String) handle.invoke(user);

Bonnes pratiques de réflexion

Mettez les objets Field/Method en cache — ne les récupérez jamais dans des boucles très sollicitées. Encapsulez la réflexion dans des classes de service. Envisagez MethodHandles pour améliorer les performances. Préférez les interfaces à la réflexion lorsque c’est possible.

Vérification rapide

Lorsqu’une méthode appelée par réflexion lève une exception, quelle exception encapsule la cause ?

Récapitulatif

Utilisez setAccessible(true) pour accéder aux membres privés. Appelez les méthodes via method.invoke(). Désencapsulez InvocationTargetException. Mettez les objets de réflexion en cache. Préférez MethodHandles dans les chemins très sollicités.

Questions Fréquemment Posées

La leçon « Appeler des méthodes et accéder aux champs » est-elle gratuite ?

Oui — le texte complet de « Appeler des méthodes et accéder aux champs » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Appeler des méthodes et accéder aux champs » ?

Appelez des méthodes privées et définissez des champs inaccessibles avec Method.invoke et Field.set, en utilisant setAccessible. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Java Academy ?

Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Appeler des méthodes et accéder aux champs » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?

Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Inspection des classes avec la réflexion
  2. Appeler des méthodes et accéder aux champs
  3. Proxys dynamiques avec InvocationHandler
  4. Performances de la réflexion et solutions de remplacement
← Retour à Java Academy