Pour accéder aux champs privés, vous devez les obtenir à partir des champs déclarés de la classe, puis les rendre accessibles:
Field f = obj.getClass().getDeclaredField("stuffIWant"); //NoSuchFieldException
f.setAccessible(true);
Hashtable iWantThis = (Hashtable) f.get(obj); //IllegalAccessException
EDIT : comme l'a commenté aperkins , à la fois accéder au champ, le définir comme accessible et récupérer la valeur peut lancer Exception
s, bien que les seules exceptions vérifiées dont vous devez être conscient soient commentées ci-dessus.
Le NoSuchFieldException
serait levé si vous demandiez un champ par un nom qui ne correspondait pas à un champ déclaré.
obj.getClass().getDeclaredField("misspelled"); //will throw NoSuchFieldException
Le IllegalAccessException
serait jeté si le champ n'était pas accessible (par exemple, s'il est privé et n'a pas été rendu accessible en manquant la f.setAccessible(true)
ligne.
Les RuntimeException
s qui peuvent être levés sont soit SecurityException
s (si la machine virtuelle Java SecurityManager
ne vous permet pas de modifier l'accessibilité d'un champ), soit IllegalArgumentException
s, si vous essayez d'accéder au champ sur un objet qui n'est pas du type de la classe du champ:
f.get("BOB"); //will throw IllegalArgumentException, as String is of the wrong type