2011-04-05 25 views
6

estoy tratando de crear una función que devuelve el nombre del método desde dentro de ese método:¿Cómo obtengo el nombre del método dentro de ese método?

public static String getMethodName(final int depth) 
    { 
    final StackTraceElement[] ste = Thread.currentThread().getStackTrace(); 
    return ste[ste.length - 1 - depth].getMethodName(); 
    } 

Sin embargo, cuando llamo a este método de Activity.onCreate(), devuelve "principal" en lugar de "onCreate" .

¿Cómo obtengo el nombre del método real dentro de ese método?

Respuesta

8
return ste[1+depth].getMethodName(); 

Si cambia instrucción de retorno que el anterior, se llega a la llamada inmediata nombre del método, de la profundidad cource shoould ser cero ..

+0

Probé su cambio sugerido y ahora se vuelve "getStackTrace" . Lo estoy llamando con getMethodName (0) por supuesto. –

+4

@Android Eve, ste [0] -> getStackTrace, ste [1] -> getMethodName, ste [2] -> llamada inmediata de getMethodName ... –

+0

getMethodName (2) hizo el truco. ¡Gracias! (y +7). –

1

Creo que su problema puede que se accede a la pila al revés. En el elemento de valor devuelto, 0 es la llamada más reciente (que sería getStackTrace()). Creo que lo que se viene a hacer es:

public static String getMethodName(final int depth) { 
    final StackTraceElement[] ste = Thread.currentThread().getStackTrace(); 
    return ste[1 + depth].getMethodName(); 
} 

Esto se entra a la llamada más reciente en la pila (fuera de la llamada a getStackTrace()). Por ejemplo, si tiene un método:

public void foo() { 
    System.out.println(getMethodName(0)); 
} 

Esto imprimirá "foo" con la implementación anterior de la función. Por supuesto, es posible que también desee agregar algunos límites para verificar la función, ya que podría salir fácilmente de la matriz.

+0

Intenté su cambio sugerido y ahora devuelve "getStackTrace". Lo estoy llamando con getMethodName (0) por supuesto. –

3

A pesar de que iniciar una excepción es una forma más costosa, lo haría de todos modos.

Log.d("CurrentMethod", new Exception().getStackTrace()[0].getMethodName()); 

Funciona si se llama enCrear.

+1

No entiendo: ¿por qué crear una excepción en lugar de llamar a 'Thread.currentThread(). GetStackTrace()'? –

2

un producto único para gestionar registros:

public class ActiveLog { 
public static final String TAG = "TRACE LOG"; 
private static ActiveLog instance; 
private static boolean actif; 

public static ActiveLog getInstance() { 
    if (null == instance) 
     instance = new ActiveLog(); 
    return instance; 
} 

private ActiveLog() { 
    ActiveLog.setActif(true); 
} 

public void log() { 
    if(isActif()) 
     Log.d(TAG, "" + (new Exception().getStackTrace()[1].getClassName()) 
         + ": " 
         + (new Exception().getStackTrace()[1].getMethodName())); 
} 

public static boolean isActif() { 
    return actif; 
} 

public static void setActif(boolean actif) { 
    ActiveLog.actif = actif; 
}} 

Un ejemplo de uso:

public class MyTest { 
    public void test() { 
    ActiveLog.getInstance().log(); 
    } 
} 

El resultado:

09-05 14:37:09.822: D/TRACE LOG(XXXX): com.TestProject.MyTest: test 
Cuestiones relacionadas