Comment puis-je obtenir le nom de la méthode dans cette méthode?

J'essaie de créer une fonction qui renvoie le nom de la méthode dans cette méthode:

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

Cependant, lorsque j'appelle cette méthode à partir d'Activity.onCreate (), il renvoie "main" au lieu de "onCreate".

Comment puis-je obtenir le nom de la méthode réelle dans cette méthode?

  • Comment accéder à setPreferredNetworkType dans la source Android
  • Changement de bibliothèque de gestion de réflexion Java
  • Reflex Java pour la méthode statique privée avec des paramètres
  • Mode Avion en Jelly Bean
  • Annotation personnalisée Java et chargement dynamique
  • Obtenir "java.lang.reflect.InvocationTargetException" lors de l'enregistrement du récepteur de diffusion de l'apk intégré
  • La méthode setMobileDataEnabled n'est plus appelable à partir d'Android L et plus tard
  • Classe personnalisée de chargement / suppression des classes Android-indigènes
  • 4 Solutions collect form web for “Comment puis-je obtenir le nom de la méthode dans cette méthode?”

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

    Si vous modifiez l'énoncé de retour comme ci-dessus, vous obtiendrez le nom de la méthode d'appel immédiate, de la profondeur cource devrait être zéro ..

    Malgré le fait que l'introduction d'une exception soit plus coûteuse, je le ferais de toute façon.

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

    Fonctionne si appelée onCréer.

    Un single pour gérer les journaux:

     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 exemple d'utilisation:

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

    Le résultat:

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

    Je pense que votre problème peut-être que vous accédez à la pile à l'envers. Dans l'élément de valeur renvoyée, 0 est l'appel le plus récent (qui serait getStackTrace ()). Je pense que ce que vous avez l'intention de faire est:

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

    Cela accède à l'appel le plus récent dans la pile (en dehors de l'appel à getStackTrace ()). Par exemple, si vous avez une méthode:

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

    Cela va imprimer "foo" avec la mise en œuvre ci-dessus de la fonction. Bien sûr, vous pouvez également ajouter des limites de vérification de la fonction car il pourrait facilement aller à l'extérieur du tableau.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.