01: import java.lang.reflect.*;
02: import java.util.*;
03: 
04: /**
05:    This program shows how to use reflection to print
06:    the names and values of all nonstatic fields of an object.
07: */
08: public class FieldTester
09: {
10:    public static void main(String[] args)
11:          throws IllegalAccessException
12:    {
13:       Random r = new Random();
14:       System.out.print(spyFields(r));
15:       r.nextInt();
16:       System.out.println("\nAfter calling nextInt:\n");      
17:       System.out.print(spyFields(r));
18:    }
19: 
20:    /**
21:       Spies on the field names and values of an object.
22:       @param obj the object whose fields to format
23:       @return a string containing the names and values of
24:       all fields of obj
25:    */
26:    public static String spyFields(Object obj)
27:          throws IllegalAccessException
28:    {
29:       StringBuffer buffer = new StringBuffer();
30:       Field[] fields = obj.getClass().getDeclaredFields();
31:       for (Field f : fields)
32:       {
33:          if (!Modifier.isStatic(f.getModifiers()))
34:          {
35:             f.setAccessible(true);
36:             Object value = f.get(obj);
37:             buffer.append(f.getType().getName());
38:             buffer.append(" ");
39:             buffer.append(f.getName());
40:             buffer.append("=");
41:             buffer.append("" + value);
42:             buffer.append("\n");
43:          }
44:       }
45:       return buffer.toString();
46:    }
47: }