Básicamente tengo una declaración de registro dentro de un método. Siempre que se llame al método, quiero llamar fácilmente el nombre del método y anexarlo a la declaración de registro. Esto se hace para minimizar el número de líneas codificadas en mi aplicación. ¿Es posible hacerlo a bajo costo?¿Puedo llamar económicamente a un método de Java para obtener el nombre del método actual?
Respuesta
No, no es barato. La forma costosa y única de hacerlo es con una llamada de método StackTrace
. Lo mejor es solo codificarlo.
Bueno, eso está muy mal. No sé por qué Java no puede hacer esto de manera barata todavía. –
AspectJ fue diseñado para tratar problemas como este – antlersoft
¿Cómo usaría AspectJ para hacer algo como esto? El método más cercano que puedo encontrar es "getSourceMethod()" –
Si solo necesita el nombre del método y el número de línea, puede hacerlo razonablemente rápido. En mi micro de referencia que puede hacer acerca de 120.000 llamadas por segundo:
public class A {
private static final int N = 1000000;
public static void main(String[] args) {
A a = new A();
long l = System.currentTimeMillis();
for (int i = 0; i < N; i++) {
a.test(0);
a.test(1);
a.test(2);
}
double time = (System.currentTimeMillis() - l)/1000d;
System.err.println(time + " seconds");
System.err.println(N/time + " calls/second");
}
String test(int i) {
StackTraceElement ste = Thread.currentThread().getStackTrace()[i];
return ste.getMethodName() + ":" + ste.getLineNumber();
}
}
también vemos this answer.
'String test (int i) { StackTraceElement ste = Thread.currentThread(). getStackTrace() [i]; // String aString = "bleh"; // return aString; return ste.getMethodName(); }} 'Me corrió la prueba entre hacer un código permanente y haciendo StackTrace // // Con StackTrace 30.281 segundos //33024.00845414616 llamadas/segundo // segunda pasada //17.937 segundos // 55750 llamadas/segundo // Con cadena dura //0.016 segundos //6.25E7 llamadas/segundo --- Básicamente, un aumento de 100 veces el costo en comparación con un retorno de cadena codificado – TravMan
Derecha. Pero todo depende de la frecuencia con que se llame a este código. Digamos, si lo llamas solo una vez por segundo, quizás puedas pagarlo. –
¿Qué tal una anotación o algo por simplemente registrar el nombre del método actual, para poder cortar y pegar lo maldito sin cambiar la estúpida cadena una y otra vez? – ggb667
Por qué reinventar la rueda, java.util.logging.Logger utiliza
/**
* Gets the StackTraceElement of the first class that is not this class.
* That should be the initial caller of a logging method.
* @return caller of the initial logging method or null if unknown.
*/
private StackTraceElement getCallerStackFrame()
{
Throwable t = new Throwable();
StackTraceElement[] stackTrace = t.getStackTrace();
int index = 0;
// skip to stackentries until this class
while(index < stackTrace.length
&& !stackTrace[index].getClassName().equals(getClass().getName()))
index++;
// skip the stackentries of this class
while(index < stackTrace.length
&& stackTrace[index].getClassName().equals(getClass().getName()))
index++;
return index < stackTrace.length ? stackTrace[index] : null;
}
dudo que lo conseguirá más rápido que esto.
[Editar] Para obtener el nombre de métodos de llamada utilización,
StackTraceElement caller = getCallerStackFrame();
String name = caller != null ? caller.getMethodName() : "<unknown>"
Esto usa StackTrace y requiere que use el registrador de Java. Está bien si estás haciendo pruebas en una aplicación pequeña en casa, pero según la prueba que se muestra a continuación, StackTrace es 100 veces más lento. – TravMan
@TravMan Estoy de acuerdo, él acaba de pedir un método externo que podría llamar que devolvería el nombre del método de las personas que llaman, salvo que se codificara el nombre (y la reflexión [wooo bad] aparentemente), este método sería el más rápido. Sin embargo, 100 veces no tiene marco de referencia e imagino que todo esto es discutible y estamos persiguiendo al hada de la micro-optimización. – Andrew
también upvoted, nunca usó la clase Logger así – TravMan
consideró usted escribir mensajes de registro sensibles en su lugar? Quiero decir, mensajes que simplemente le dicen al lector que inicie sesión la "historia" sobre cómo se ejecuta el código. mensajes que realmente difieren para diferentes métodos?
log4j: some.package.Class1: method1: checkpoint #1
log4j: some.package.Class1: method1: checkpoint #2
log4j: some.package.Class2: method2: checkpoint #1
log4j: some.package.Class2: method2: checkpoint #2
estado golpeando mi cabeza en el registro como la de arriba solo una o dos semanas atrás (nombres de los métodos fueron codificados). No lo sentí notablemente más útil que no registrarlo en absoluto.
- 1. Obtener el nombre del método actual
- 2. Obtener el nombre del método actual que se está ejecutando
- 3. ¿Cómo obtener el nombre del método actual en Delphi 7?
- 4. Método del hilo actual java
- 5. Recuperación dinámica del nombre del método actual
- 6. ¿Cómo puedo llamar a un método dado solo su nombre?
- 7. ¿Cómo llamar a un método en Java?
- 8. llamar a otro método en el principal método en Java
- 9. ¿Puede un método nativo llamar a un método privado?
- 10. Usar JDT para obtener el nombre completo del método
- 11. Obteniendo el nombre del método actual en C++
- 12. Android/Java: ¿Llamar a un método usando la reflexión?
- 13. ¿Cómo obtener el nombre de la clase actual en un método estático?
- 14. Llamar a cualquier método Java desde C#
- 15. Llamar a un método de Python por nombre
- 16. Cómo utilizar el método de reflexión para llamar por nombre
- 17. ¿Cómo puedo llamar a un método en un objeto nulo?
- 18. Método del escáner para obtener un char
- 19. Llamar a un método NSTimer
- 20. Obtener el nombre del archivo ejecutable desde el método main()
- 21. Llamar a un método asíncrono de un método no asíncrono
- 22. Usar Reflection para llamar a un método de una propiedad
- 23. Llamar a un método genérico java sobrecargada de Scala
- 24. ¿Cómo obtener el nombre o la firma del método actual en un NSString?
- 25. Llamar a un método anulado, superclase a llamadas reemplazadas método
- 26. Obtener el nombre de un método utilizando una expresión
- 27. ¿Cómo obtener el nombre del método ganar 8 aplicación
- 28. Llamar a un método Java estática protegido de Scala
- 29. ¿Cómo puedo llamar a un método de WebApi desde el Método de acción MVC Controller?
- 30. Llamar a un método genérico con un método genérico
No creo que haya un buen método que pueda usarse en tiempo de ejecución para hacerlo, pero probablemente podría anotar los métodos que necesitan esta funcionalidad y luego escribir un procesador de anotación que se incorpore en su proceso de compilación. En tiempo de ejecución funcionaría de manera casi idéntica a la codificación del nombre del método, pero en realidad no tendrías que codificar nada. –
posible duplicado de [Obteniendo el nombre del método de ejecución actual] (http://stackoverflow.com/questions/442747/getting-the-name-of-the-current-executing-method) – bmargulies