GenericToString.java

GenericToString is a utility that Java should have inside the standard library. You can call it on objects by "GenericToString.genericToString(obj);" and it will return a string that contains all of the fields of the object, found by reflection. The output of it is modeled after Kernel#inspect in Ruby.

import java.lang.reflect.Field;
import java.lang.reflect.Method;

class GenericToString {
    private static boolean definesToString(Class c) {
        try {
            if (c == Class.forName("java.lang.Object"))
                return false;
            try {
                Method m = c.getDeclaredMethod("toString");
                return true;
            } catch (NoSuchMethodException e) {
                return definesToString(c.getSuperclass());
            }
        } catch (ClassNotFoundException e) {
            return false; //Should never be reached.
        }
    }

    public static String genericToString(Object o) {
        return genericToString(o, 2);
    }

    public static String genericToString(Object o, int depth) {
        if (depth < 0)
            return "..";
        if (o == null)
            return "NULL";
        Class c = o.getClass();
        if (definesToString(c)) {
            return "<" + o.toString() + ">";
        } else {
            Field fields[] = c.getFields();
            StringBuffer buffer = new StringBuffer(5000);
            buffer.append("<" + c.getName() + ":");
            for (Field f:fields)
                try {
                    buffer.append(" " + f.getName() + "= " + genericToString(f.get(o), depth - 1));
                } catch (IllegalAccessException e) {
                }
            buffer.append(">");
            return buffer.toString();
        }
    }
}