2009-11-20 7 views
28

J'essaye d'écrire une méthode qui va obtenir un champ privé dans une classe en utilisant la réflexion.Accéder à des variables privées en Java par réflexion

Voilà ma classe (simplifiée pour cet exemple):

public class SomeClass { 
    private int myField; 

    public SomeClass() { 
     myField = 42; 
    } 

    public static Object getInstanceField(Object instance, String fieldName) throws Throwable { 
     Field field = instance.getClass().getDeclaredField(fieldName); 
     return field.get(instance); 
    } 
} 

Alors dis-je le fais:

SomeClass c = new SomeClass(); 
Object val = SomeClass.getInstanceField(c, "myField"); 

Je reçois un IllegalAccessException parce myField est privé. Y at-il un moyen d'obtenir/définir des variables privées en utilisant la réflexion? (Je l'ai fait en C#, mais c'est la première fois que je l'ai essayé en Java). Si vous vous demandez pourquoi il est si nécessaire de faire une telle folie :), c'est parfois parce que, lors des tests unitaires, il est parfois utile de définir des variables privées sur des valeurs erronées pour les tests d'échecs.

Répondre

32

Compris. Besoin

field.setAccessible(true); 
+3

garder à l'esprit que cela ne fonctionnera pas s'il y a PermissionManager – Bozho

+0

Cela peut améliorer les performances légèrement même si le membre est par ailleurs accessible (car il fait tourner les contrôles off) –

+0

+1 ce juste m'a sauvé quelques-uns frustration :) –

Questions connexes