2011-07-31 10 views
8

estoy usando este tipo de patrón:¿Hay alguna forma de registrar automáticamente el nombre del método en Android?

public class FooProvider extends ContentProvider { 
    private static final String TAG = FooProvider.class.getSimpleName(); 
    ... 

    @Override 
    public int update(Uri uri, ContentValues values, String where, String[] whereArgs) { 
     l.v(TAG, TAG + ".update() Uri:" + uri.toString() + " " + db.getPath()); 

donde L es mi envoltura redonda androides Log.v que tiene Cuerda ... args. Esto da salida Logcat así:

FooProvider.update() Uri: foo bar etc 

Lo que estoy buscando es una manera de registrar el nombre del método, en este caso la actualización(), de forma automática y de manera que sobrevive refactorización la forma TAG hace. He visto la llamada class.getMethods() pero no veo una forma de indexar la lista devuelta con el método actual en tiempo de ejecución.

+0

debe probar esta sencilla lib: https://github.com/MustafaFerhan/DebugLog – gturedi

Respuesta

13

Es posible que desee para envolver estas declaraciones en una constante, por lo que se compilan a cabo para su versión publicada (que no va a imprimir declaraciones Log.v de todos modos), pero se puede hacer algo como esto:

private static final boolean FINAL_CONSTANT_IS_LOCAL = true; 
private static final String TAG = FooProvider.class.getSimpleName(); 

private String getLogTagWithMethod() { 
    if (FINAL_CONSTANT_IS_LOCAL) { 
     Throwable stack = new Throwable().fillInStackTrace(); 
     StackTraceElement[] trace = stack.getStackTrace(); 
     return trace[0].getClassName() + "." + trace[0].getMethodName() + ":" + trace[0].getLineNumber(); 
    } else { 
     return TAG; 
    } 
} 

Depende de cómo lo llame para determinar qué índice StackTraceElement va a querer, simplemente depúrelo o juegue varias veces para encontrarlo.

Cuando compila su versión publicada, simplemente configure FINAL_CONSTANT_IS_LOCAL en falso y ese bloque de código desaparecerá, siempre devolviendo TAG.

+0

Eso es ingenioso. Idistic también fue inteligente; desearía poder premiarlos a los dos. –

9

Parece caro, pero se podría utilizar

String Method = Thread.currentThread().getStackTrace()[2].getMethodName(); 

La razón se utiliza un índice de 2, es que 0 = volvería currentThread y 1 = getStackTrace. Esto funciona en Java 1.5 y superior, lo envolvería en algún tipo de cosa (DEBUG) {} por lo que no está en el código de producción

Por supuesto, tendrá que ajustar la profundidad si pone eso dentro de un método, etc.

0

que podría hacer que los métodos estáticos como estos y llamarlos desde el principio y el final de los métodos que desea depurar:

public static void entry_log(String id) { 
       Throwable stack = new Throwable().fillInStackTrace(); 
       StackTraceElement[] trace = stack.getStackTrace(); 

        Log.v("ENTRY", 
          id + " - " + trace[1].getClassName() + "." 
            + trace[1].getMethodName() + ":" 
            + trace[1].getLineNumber()); 
        break; 

      } 

Y

public void exit_log(String id) { 
      Throwable stack = new Throwable().fillInStackTrace(); 
      StackTraceElement[] trace = stack.getStackTrace(); 

       Log.v("EXIT", 
         id + " - " + trace[1].getClassName() + "." 
           + trace[1].getMethodName() + ":" 
           + trace[1].getLineNumber()); 
       break; 

     } 

creé this Logging utility para Android con algunas características más, aparte de los registros de entrada y salida. Tu podrias encontrar esto útil.

Cuestiones relacionadas