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 Exceptions, bien que les seules exceptions vérifiées dont vous devez être conscient soient commentées ci-dessus.
Le NoSuchFieldExceptionserait 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 IllegalAccessExceptionserait 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 RuntimeExceptions qui peuvent être levés sont soit SecurityExceptions (si la machine virtuelle Java SecurityManagerne vous permet pas de modifier l'accessibilité d'un champ), soit IllegalArgumentExceptions, 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