Comment obtenir le nom d’une méthode en cours d’exécution?

Comment obtenir le nom d'une méthode en cours d'exécution?

1. Vue d'ensemble

Parfois, nous avons besoin de connaître le nom de la méthode Java en cours d’exécution.

Cet article rapide présente quelques méthodes simples pour obtenir le nom de la méthode dans la pile d'exécution en cours.

2. Utilisation degetEnclosingMethod

Nous pouvons trouver le nom de la méthode en cours d'exécution en utilisant l'APIgetEnclosingMethod():

public void givenObject_whenGetEnclosingMethod_thenFindMethod() {
    String methodName = new Object() {}
      .getClass()
      .getEnclosingMethod()
      .getName();

    assertEquals("givenObject_whenGetEnclosingMethod_thenFindMethod",
      methodName);
}

3. Utilisation deThrowable Stack Trace

L'utilisation d'une trace de pileThrowable nous donne une trace de pile avec la méthode en cours d'exécution:

public void givenThrowable_whenGetStacktrace_thenFindMethod() {
    StackTraceElement[] stackTrace = new Throwable().getStackTrace();

    assertEquals(
      "givenThrowable_whenGetStacktrace_thenFindMethod",
      stackTrace[0].getMethodName());
}

4. Utilisation de Thread Stack Trace

De plus, la trace de pile d'un thread actuel (depuis JDK 1.5) inclut généralement le nom de la méthode en cours d'exécution:

public void givenCurrentThread_whenGetStackTrace_thenFindMethod() {
    StackTraceElement[] stackTrace = Thread.currentThread()
      .getStackTrace();

    assertEquals(
      "givenCurrentThread_whenGetStackTrace_thenFindMethod",
      stackTrace[1].getMethodName());
}

Cependant, nous devons nous rappeler que cette solution présente un inconvénient important. Certaines machines virtuelles peuvent ignorer un ou plusieurs cadres de pile. Bien que cela ne soit pas courant, nous devrions être conscients que cela peut arriver.

5. Conclusion

Dans ce tutoriel, nous avons présenté quelques exemples pour obtenir le nom de la méthode en cours d'exécution. Les exemples sont basés sur les traces de pile et lesgetEnclosingMethod().

Comme toujours, vous pouvez consulter les exemples fournis dans cet articleover on GitHub.