Para acceder a los campos privados, debe obtenerlos de los campos declarados de la clase y luego hacerlos accesibles:
Field f = obj.getClass().getDeclaredField("stuffIWant"); //NoSuchFieldException
f.setAccessible(true);
Hashtable iWantThis = (Hashtable) f.get(obj); //IllegalAccessException
EDITAR : como ha comentado aperkins , tanto acceder al campo, configurarlo como accesible y recuperar el valor puede arrojar Exceptions, aunque las únicas excepciones marcadas de las que debe tener en cuenta se comentaron anteriormente.
Se NoSuchFieldExceptiongeneraría si solicitara un campo con un nombre que no correspondiera a un campo declarado.
obj.getClass().getDeclaredField("misspelled"); //will throw NoSuchFieldException
Se IllegalAccessExceptiongeneraría si el campo no fuera accesible (por ejemplo, si es privado y no se ha hecho accesible al perder la f.setAccessible(true)línea).
Los RuntimeExceptions que se pueden lanzar son SecurityExceptions (si las JVM SecurityManagerno le permitirán cambiar la accesibilidad de un campo), o IllegalArgumentExceptions, si intenta acceder al campo en un objeto que no es del tipo de clase del campo:
f.get("BOB"); //will throw IllegalArgumentException, as String is of the wrong type