Existe-t-il un moyen d'obtenir le nom de la méthode en cours d'exécution en Java?
java
reflection
methods
Omar Kooheji
la source
la source
Techniquement, cela fonctionnera ...
Cependant, une nouvelle classe interne anonyme sera créée pendant la compilation (par exemple
YourClass$1.class
). Cela va donc créer un.class
fichier pour chaque méthode qui déploie cette astuce. De plus, une instance d'objet autrement inutilisée est créée à chaque appel pendant l'exécution. Donc, cela peut être une astuce de débogage acceptable, mais cela s'accompagne d'une surcharge importante.Un avantage de cette astuce est que les
getEncosingMethod()
retoursjava.lang.reflect.Method
peuvent être utilisés pour récupérer toutes les autres informations de la méthode, y compris les annotations et les noms de paramètres. Cela permet de distinguer des méthodes spécifiques du même nom (surcharge de méthode).Notez que selon le JavaDoc de
getEnclosingMethod()
cette astuce ne devrait pas jeter unSecurityException
car les classes internes doivent être chargées en utilisant le même chargeur de classe. Il n'est donc pas nécessaire de vérifier les conditions d'accès même si un responsable sécurité est présent.Il est nécessaire d'utiliser
getEnclosingConstructor()
pour les constructeurs. Pendant les blocs en dehors des méthodes (nommées),getEnclosingMethod()
retournenull
.la source
getEnclosingMethod
obtient le nom de la méthode où la classe est définie.this.getClass()
ne vous aidera pas du tout. @wutzebaer pourquoi en auriez-vous même besoin? Vous y avez déjà accès.Janvier 2009:
Un code complet serait (à utiliser avec la mise en garde de @ Bombe à l'esprit):
Plus dans cette question .
Mise à jour de décembre 2011:
commentaires bleutés :
virgo47 de réponse (upvoted) calcule effectivement l'index droit d'appliquer afin de récupérer le nom de la méthode.
la source
StackTraceElement
tableau à des fins de débogage et de voir si «principal» est réellement la bonne méthode?ste[2 + depth].getMethodName()
. 0 estgetStackTrace()
, 1 estgetMethodName(int depth)
et 2 appelle la méthode. Voir aussi la réponse de @ virgo47 .Nous avons utilisé ce code pour atténuer la variabilité potentielle de l'index de trace de pile - appelez maintenant methodName util:
Semble trop conçu, mais nous avions un certain nombre fixe pour JDK 1.5 et nous avons été un peu surpris que cela ait changé lorsque nous sommes passés à JDK 1.6. Maintenant, c'est la même chose en Java 6/7, mais on ne sait jamais. Ce n'est pas une preuve des changements dans cet index pendant l'exécution - mais j'espère que HotSpot ne fait pas si mal. :-)
la source
nom aura une valeur foo.
la source
null
Ces deux options fonctionnent pour moi avec Java:
Ou:
la source
Le moyen le plus rapide que j'ai trouvé est que:
Il accède directement à la méthode native getStackTraceElement (int depth). Et stocke la méthode accessible dans une variable statique.
la source
new Throwable().getStackTrace()
pris 5614 ms.Utilisez le code suivant:
la source
la source
Ceci est une extension de la réponse de virgo47 (ci-dessus).
Il fournit des méthodes statiques pour obtenir les noms de classe / méthode actuels et appelants.
la source
Pour obtenir le nom de la méthode qui a appelé la méthode actuelle, vous pouvez utiliser:
Cela fonctionne sur mon MacBook ainsi que sur mon téléphone Android
J'ai aussi essayé:
mais Android retournera "getStackTrace". Je pourrais résoudre ce problème pour Android avec
mais je reçois la mauvaise réponse sur mon MacBook
la source
getStackTrace()[0]
plutôt quegetStackTrace()[1]
. YMMV.Thread.currentThread().getStackTrace()[2]
Util.java:
SomeClass.java:
la source
final StackTraceElement e = Thread.currentThread().getStackTrace()[2];
travaux;e.getClassName();
retourne le nom complet de la classe ete.getMethodName()
retourne le nom du méthon.getStackTrace()[2]
est faux, cela doit êtregetStackTrace()[3]
dû au fait que: [0] dalvik.system.VMStack.getThreadStackTrace [1] java.lang.Thread.getStackTrace [2] Utils.getCurrentClassAndMethodNames [3] La fonction a () l'appelantCela peut être fait en utilisant
StackWalker
depuis Java 9.StackWalker
est conçu pour être paresseux, il est donc probablement plus efficace que, par exemple,Thread.getStackTrace
qui crée avec impatience un tableau pour l'ensemble de la pile d'appels. Consultez également le JEP pour plus d'informations.la source
Une autre méthode consiste à créer, mais pas à lever, une exception et à utiliser cet objet à partir duquel obtenir les données de trace de pile, car la méthode englobante sera généralement à l'index 0 - tant que la JVM stocke ces informations, comme d'autres l'ont fait. mentionné ci-dessus. Ce n'est cependant pas la méthode la moins chère.
De Throwable.getStackTrace () (c'est la même chose depuis Java 5 au moins):
L'extrait ci-dessous suppose que la classe n'est pas statique (à cause de getClass ()), mais c'est un aparté.
la source
la source
J'ai une solution en utilisant cela (dans Android)
la source
Je ne sais pas quelle est l'intention derrière l'obtention du nom de la méthode actuellement exécutée, mais si c'est juste à des fins de débogage, les cadres de journalisation comme "logback" peuvent aider ici. Par exemple, lors de la déconnexion, tout ce que vous devez faire est d' utiliser le modèle "% M" dans votre configuration de journalisation . Cependant, cela doit être utilisé avec prudence car cela peut dégrader les performances.
la source
Juste au cas où la méthode dont vous voulez connaître le nom est une méthode de test junit, vous pouvez utiliser la règle junit TestName: https://stackoverflow.com/a/1426730/3076107
la source
La plupart des réponses ici semblent fausses.
Exemple:
Les sorties:
la source
J'ai réécrit un peu la réponse du maklemenz :
la source
la source
getEnclosingMethod()
lance unNullPointerException
pour moi dans Java 7.Quel est le problème avec cette approche:
Et avant que les gens ne deviennent fous de l'utilisation,
System.out.println(...)
vous pouvez toujours, et devriez, créer une méthode pour que la sortie puisse être redirigée, par exemple:la source