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?

  • Obtenir "java.lang.reflect.InvocationTargetException" lors de l'enregistrement du récepteur de diffusion de l'apk intégré
  • ClassLoader pour remplacer une classe préchargée?
  • Android, comment effacer la liste de tâches récente qui pourrait passer du bouton Accueil dans la plupart des téléphones? La réflexion est-elle possible?
  • Keep Wifi-Direct a activé les périphériques AOSP
  • Protection contre la réflexion - Android
  • Comment une activité Android est-elle instanciée (en utilisant la réflexion)?
  • Android: comment coder en fonction de la version de l'API?
  • Les méthodes de réflexion ne fonctionnent pas lorsqu'elles sont utilisées pour l'application Android
  • 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.