When developing an application - 
even more when you just develop some parts of it- for me when having other people testing, it's always interesting - what information they fill into the objects they pass along to the methods .. 
This becomes even more relevant - if the applications that are using your methods (webservices ...), are tested and developed by a 3rd party.
So during one of my flights a built up a quick example .. for an object-logger, with using java.lang.reflect. package - as I got really fascinated by this runtime-API :)  and JDK1.3 doesn't support the XMLEncode ( decode package, that came along with 1.4 ..
The following code is just intended - as an example, of the usage of reflection, but why not using some funnny techs/api*s for such things too?!
package log;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.InvocationTargetException;
 import java.util.logging.*;
/**
 * Fast and simple ObjectLogger that prints out the values of
 * 
public fields and executes all <b>public</b> 
 * getXXX methods.
 * This is done by usage of java.lang.reflection API
 * @author Clemens Utschig - Utschig
 * @version 1.0
 * @date   23.03.2004
 */
public class ObjectLogger  {
  /**
   * The apache Logger
   */
  private static Logger mLogger;
  /**
   * GoF Singleton Instance, excutes one time the
   * 
 private  constructor
   *
  private static ObjectLogger mObjectLogger = new ObjectLogger();
  /**
   * GoF Singleton - therfor private Constructor - excuted only once,
   * just initalized the logger
   */
  private ObjectLogger() {
   mLogger = Logger.getLogger("ObjectLogger");
  }
  /**
   * Returns the singleton - instance, created as by the
   * member var.
   * @return the instance of the ObjectLogger
   */
  public static ObjectLogger getInstance () {
   return mObjectLogger;
  }
  /**
   * Logs the 
 public  fields of a given
   * Object !
   * @param pObject the Object to log
   */
  public static void logObject (Object pObject) {
   if (pObject != null) {
    mLogger.info(" --------- start logging Object ----------");
    mLogger.info("ClassName: " + pObject.getClass().getName());
    // get the publid fields with reflection
    Field [] objectFields = pObject.getClass().getFields();
    if ((objectFields != null) && (objectFields.length > 0)) {
      mLogger.info(" --------- public members ----------");
      for (int fieldIndex = 0; fieldIndex < objectFields.length; fieldIndex++) {
        try {
           mLogger.info(" - Name [" +objectFields[fieldIndex].getName()+ "] " + 
                       " type [" +objectFields[fieldIndex].getType()+ "] " + 
                      " value [" +objectFields[fieldIndex].get(pObject)+ "] ");
        } catch (IllegalAccessException illegalAccessExc) {
          mLogger.info("IllegalArgumentException");
        }
      }
    }
    // get the pulic methods
    Method [] objectMethods = pObject.getClass().getMethods();
    if ((objectMethods != null) && (objectMethods.length > 0)) {
      mLogger.info(" --------- Invocation of methods ----------");
      for (int objectMethodIndex = 0; objectMethodIndex < objectMethods.length; objectMethodIndex++) {
        try {
          if ((objectMethods[objectMethodIndex].getParameterTypes().length == 0) && 
              (objectMethods[objectMethodIndex].getName().startsWith("get"))){
            mLogger.info(" - MethodName [" + objectMethods[objectMethodIndex].getName()+ "] " +
                              " type ["  + objectMethods[objectMethodIndex].getReturnType().getName() + "]" +
                              " value [" + objectMethods[objectMethodIndex].invoke(pObject, new Object [] {}) + "] ");
          }  
        } catch (InvocationTargetException invocationTargetExc) {
          // do nothing
        } catch (IllegalAccessException illegalAccessExc) {
          // do nothing
        } catch (Exception allOthers) {
          // do nothing too
        }
      }
    }
     mLogger.info(" --------- End logging Object ----------");
   } else {
     mLogger.warning("Object given is NULL !");
   }
    
  }
  /**
   * Logs the 
public  fields/methods of a given Object Array !
   * @param pObject[] the ObjectArray to log
   */
  public static void logObject (Object pObject []) {
    if (pObject != null) {
      mLogger.info(" -- start logging ObjectArray, size: " + pObject.length + " --"); 
      for (int objectIndex = 0; objectIndex < pObject.length;  objectIndex++) {
        logObject(pObject[objectIndex]);
      }
      mLogger.info(" -- end logging ObjectArray --" ); 
    } else {
      mLogger.warning("ObjectArray given is null !");
    }
  }