¿Hay alguna manera de obtener el nombre del método que se está ejecutando actualmente en Java?
java
reflection
methods
Omar Kooheji
fuente
fuente
Técnicamente esto funcionará ...
Sin embargo, se creará una nueva clase interna anónima durante el tiempo de compilación (por ejemplo
YourClass$1.class
). Entonces esto creará un.class
archivo para cada método que despliegue este truco. Además, se crea una instancia de objeto no utilizada en cada invocación durante el tiempo de ejecución. Por lo tanto, este puede ser un truco de depuración aceptable, pero viene con una sobrecarga significativa.Una ventaja de este truco es que los
getEncosingMethod()
retornosjava.lang.reflect.Method
se pueden usar para recuperar toda la otra información del método, incluidas las anotaciones y los nombres de los parámetros. Esto permite distinguir entre métodos específicos con el mismo nombre (sobrecarga de métodos).Tenga en cuenta que de acuerdo con el JavaDoc de
getEnclosingMethod()
este truco no se debe lanzar unSecurityException
ya que las clases internas deben cargarse utilizando el mismo cargador de clases. Por lo tanto, no es necesario verificar las condiciones de acceso incluso si hay un administrador de seguridad presente.Se requiere su uso
getEnclosingConstructor()
para constructores. Durante los bloques fuera de los métodos (con nombre),getEnclosingMethod()
regresanull
.fuente
getEnclosingMethod
obtiene el nombre del método donde se define la clase.this.getClass()
no te ayudará en absoluto. @wutzebaer, ¿por qué lo necesitarías? Ya tienes acceso a ellos.Enero de 2009:
un código completo sería (para usar con la advertencia de @Bombe en mente):
Más en esta pregunta .
Actualización de diciembre de 2011:
comentarios azulados :
virgo47 's respuesta (upvoted) en realidad calcula el índice derecho de aplicar con el fin de recuperar el nombre del método.
fuente
StackTraceElement
arreglo para propósitos de depuración y ver si 'main' es realmente el método correcto?ste[2 + depth].getMethodName()
. 0 esgetStackTrace()
, 1 esgetMethodName(int depth)
y 2 es un método de invocación. Ver también la respuesta de @ virgo47 .Utilizamos este código para mitigar la variabilidad potencial en el índice de seguimiento de la pila; ahora solo llame a methodName util:
Parece un exceso de ingeniería, pero teníamos un número fijo para JDK 1.5 y nos sorprendió un poco que cambiara cuando nos mudamos a JDK 1.6. Ahora es lo mismo en Java 6/7, pero nunca se sabe. No es una prueba de los cambios en ese índice durante el tiempo de ejecución, pero espero que HotSpot no lo haga tan mal. :-)
fuente
nombre tendrá valor foo.
fuente
null
Ambas opciones me funcionan con Java:
O:
fuente
La forma más rápida que encontré es que:
Accede directamente al método nativo getStackTraceElement (int profundidad). Y almacena el Método accesible en una variable estática.
fuente
new Throwable().getStackTrace()
tomó 5614ms.Use el siguiente código:
fuente
fuente
Esta es una expansión de la respuesta de virgo47 (arriba).
Proporciona algunos métodos estáticos para obtener los nombres de clase / método actuales e invocadores.
fuente
Para obtener el nombre del método que llamó al método actual, puede usar:
Esto funciona en mi MacBook y en mi teléfono Android
También probé:
pero Android devolverá "getStackTrace". Podría arreglar esto para Android con
pero luego recibo la respuesta incorrecta en mi MacBook
fuente
getStackTrace()[0]
lugar degetStackTrace()[1]
. YMMV.Thread.currentThread().getStackTrace()[2]
Util.java:
SomeClass.java:
fuente
final StackTraceElement e = Thread.currentThread().getStackTrace()[2];
trabajos;e.getClassName();
devolver el nombre completo de la clase ye.getMethodName()
devolver el nombre del methon.getStackTrace()[2]
está mal, tiene que sergetStackTrace()[3]
porque: [0] dalvik.system.VMStack.getThreadStackTrace [1] java.lang.Thread.getStackTrace [2] Utils.getCurrentClassAndMethodNames [3] La función a () llamando a esteEsto se puede hacer
StackWalker
desde Java 9.StackWalker
está diseñado para ser perezoso, por lo que es probable que sea más eficiente que, por ejemplo,Thread.getStackTrace
que crea ansiosamente una matriz para toda la pila de llamadas. También vea el JEP para más información.fuente
Un método alternativo es crear, pero no lanzar, una Excepción, y usar ese objeto desde el cual obtener los datos de seguimiento de la pila, ya que el método de inclusión generalmente estará en el índice 0, siempre que la JVM almacene esa información, como lo han hecho otros. mencionado anteriormente. Sin embargo, este no es el método más barato.
Desde Throwable.getStackTrace () (esto ha sido lo mismo desde Java 5 al menos):
El fragmento a continuación asume que la clase no es estática (debido a getClass ()), pero eso es un aparte.
fuente
fuente
Tengo una solución usando esto (en Android)
fuente
No sé cuál es la intención detrás de obtener el nombre del método ejecutado actualmente, pero si eso es solo para fines de depuración, entonces los marcos de registro como "logback" pueden ayudar aquí. Por ejemplo, en el inicio de sesión, todo lo que necesita hacer es usar el patrón "% M" en su configuración de registro . Sin embargo, esto debe usarse con precaución ya que puede degradar el rendimiento.
fuente
En caso de que el método cuyo nombre desea saber sea un método de prueba junit, puede usar la regla Junit TestName: https://stackoverflow.com/a/1426730/3076107
fuente
La mayoría de las respuestas aquí parecen incorrectas.
Ejemplo:
Salidas:
fuente
Reescribí un poco la respuesta de maklemenz :
fuente
fuente
getEnclosingMethod()
lanza unNullPointerException
para mí en Java 7.¿Qué tiene de malo este enfoque?
Y antes de que la gente se vuelva loca por el uso
System.out.println(...)
, siempre podría y debería crear algún método para que la salida se pueda redirigir, por ejemplo:fuente