~/home of geeks

Reflection Logging

· 196 Wörter · 1 Minute(n) Lesedauer

Logging ist inzwischen für Programmierer ein unabdingbares Werkzeug zur Fehlersuche. Dabei kommt es recht häufig vor, dass man nicht einfach ein Attribut eines Objektes loggen möchte, sondern den gesamten Zustand, und dass, ohne genau zu wissen, was den nun für ein Objekt vorliegt.

Zu diesem Zweck habe ich eine kleine Klasse gebastelt, mit der man über Reflection diverse Methoden eines Objektes loggen kann.

Das Ganze ist nur beispielhaft, zumal man sich dabei natürlich überlegen muss, welche Methoden denn nun geloggt werden sollen. Der Beispiellogger loggt alle Getter-Methoden, die keine Parameter erwarten.

Natürlich kann man das auch über die Implementierung der toString()-Methode machen, aber dann würde man ja nicht mit Reflection rumspielen…

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectionLogger {

    /**
     * @param args
     */
    public static String log(Object o) {
        if (o!=null){
            StringBuffer sb = new StringBuffer();
            Method[] m = o.getClass().getMethods();
            sb.append(o.getClass().getName()+"\n");
            Class par[];
            for (int i=0; i<m.length; i++){
                if (m[i].getName().startsWith("get")){
                    par = m[i].getParameterTypes();
                    if (par.length<=0){
                        Object ret;
                        try {
                            ret = m[i].invoke(o, null);
                            sb.append(m[i].getName()+": "+String.valueOf(ret)+"\n");
                        }
                        catch (IllegalArgumentException e) {
                            //e.printStackTrace();
                        }
                        catch (IllegalAccessException e) {
                            //e.printStackTrace();
                        }
                        catch (InvocationTargetException e) {
                            //e.printStackTrace();
                        }
                        
                    }
                }
            }
            return sb.toString();
        }
        else return "null";
    }
}