12
votes

Obtenir le nom de la méthode d'enceinte

avoir la méthode xxx

est un moyen d'obtenir la méthodeName (dans ce cas foo) au moment de l'exécution?

Je sais Comment obtenir le nom de classe via

Ceci.getClass (). GetName ()

ou pour obtenir toutes les méthodes publiques via méthode [] méthodes = ceci.getclass (). getMethods (); Une fois que j'ai le nom de la méthode, les paramètres seront également importants car il pourrait y avoir plusieurs méthodes avec le même nom


1 commentaires

6 Réponses :


5
votes

4 commentaires

Pourquoi est-ce peu fiable? Avez-vous un exemple pour l'obtenir par réflexion?


@Martin Dürrmeier - La réflexion est plus impliquée. J'ai ajouté des liens pour des informations sur la méthode GetStackTrace et un manque de fiabilité potentiel.


Merci pour le lien. Pourriez-vous me donner un indice comment le faire par réflexion?


@Martin Dürrrmeier - généralement avec réflexion, vous connaissez le nom de la méthode à l'avance. Utilisation d'un objet Classe , vous pouvez appeler getMethods et faire correspondre le nom avec les types d'arguments appropriés pour obtenir une méthode méthode . Découvrez le Javadoc pour Classe : Java.sun.com/javase/6/docs/api/java/lang/class.html



5
votes

Je ne suis pas sûr de savoir pourquoi vous devez faire cela, mais vous pouvez toujours créer un neuf lanceur () et getStacktace () , puis requête StackTraceElement.getMethodName () .

En tant que bonus, vous obtenez le tout la trace de la pile jusqu'au point d'exécution, pas seulement la méthode d'enceinte immédiatement.

Questions connexes


2 commentaires

Merci! Je crée des observateurs de commonBaseevents à l'écart du nom de classe la méthodeName Voir aussi télécharger.boulder.ibm.com/ibmdl/pub/software/dw/library/...


Jonathon a souligné ce que le Javadoc de 'GetStacktace () "dit" des machines virtuelles peut, dans certaines circonstances, omet un ou plusieurs cadres de pile de la trace de la pile ". Donc, j'essaie de réflexion. Avez-vous une idée de la façon dont il fonctionne via une réflexion?



1
votes

Vous pouvez duper le nom du code.

// The Annotation Processor will complain if the two method names get out of synch
class MyClass
{
    @HardCodedMethodName ( ) 
     void myMethod ( )
     {
          @ HardCodedMethodName // Untried but it seems you should be able to produce an annotation processor that compile time enforces that myname = the method name.
          String myname = "myMethod" ;
          ...
     }
}


0 commentaires

5
votes

J'utilise le code comme ce qui suit: XXX

Il suffit de quitter le nom de classe + "." partie et voir si cela répond à vos besoins.


0 commentaires

0
votes

Cette question a été posée il y a des années, mais je pense que cela mériterait de synthétiser les réponses précédentes dans une expression plus simple: xxx

malgré sa laideur et les problèmes de fiabilité cités, c'est Nettoyer et peut être facilement utilisé avec log.x () Fonctions pour aider au débogage.


0 commentaires

2
votes

Utilisez ce code: xxx


0 commentaires