2010-12-06 18 views
0

J'écris une méthode Java avec la signature suivante.Comment une méthode Java peut-elle récupérer l'objet de méthode appartenant à cette méthode particulière? (Java)

void Logger (Méthode de méthode, Object [] args);

Si une méthode (par exemple ABC()) appelle cette méthode Logger, elle doit récupérer l'objet Method qui encapsule des données sur elle-même (ABC()) et le transmettre en tant qu'argument.

Comment une méthode peut-elle récupérer l'objet Method qui stocke toutes les informations sur cette méthode?

Une méthode simple est que j'utilise Méthode [] methods = ExampleClass.Class.getMethods(); et recherchez l'ensemble du tableau pour la méthode avec le nom correct. (Ce qui est assez inefficace). De plus, si deux méthodes ou plus ont le même nom, je devrai aussi récupérer leurs types de paramètres (pour les distinguer) et avoir un code différent pour chaque méthode. Ce serait inefficace et douloureux.

Y a-t-il un meilleur moyen?

Merci pour l'aide.

+1

Quel est le but de tout cela la magie de code? Si vous pouvez dire le but alors peut-être que quelqu'un peut suggérer une meilleure façon de le faire plutôt que toute cette logique compliquée. –

Répondre

5

Ne le faites pas. Obtenez plutôt le nom de la méthode à partir de la pile.

public void log(Object object) { 
    String methodName = Thread.currentThread().getStackTrace()[2].getMethodName(); 
    // ... 
} 

Ceci est cependant assez cher et qui est la raison pour laquelle la plupart des cadres d'exploitation forestière auto respecté offrent une option pour activer/désactiver (que je recommande d'utiliser au lieu de homegrowing un).

+0

+1. Je suis d'accord que 1) C'est la façon de le faire; et 2) il devrait être évité * en général * (bien que les enregistreurs soient une bonne exception). –

+0

Je ne veux pas le nom de la méthode. Je veux son objet. Le nom Logger est trompeur (mon erreur). Il pousse tous les objets de méthode dans un arrayList avec leurs arguments. Le arrayList est traversé plus tard et les mêmes méthodes sont appelées dans le même ordre avec les mêmes arguments. Donc, avoir les objets serait beaucoup plus génial. Si ce n'est pas les objets de méthode, je vais bien obtenir le nom de la méthode et tous les arguments aussi. – Karan

+0

Réinventez-vous un cadre de test? Si non, avez-vous considéré le modèle de commandement/stratégie? Eh bien, vous avez un moyen facile d'obtenir le nom de la méthode (il y a plus d'informations dans ['StackTraceElement'] (http://download.oracle.com/javase/6/docs/api/java/lang/StackTraceElement.html) ainsi que). Il n'est pas vraiment possible de passer la 'Method' elle-même de l'intérieur de la méthode appelante, ce qui ne ferait que créer beaucoup de fouillis dupliqués dans chacune des méthodes appelantes. En passant, pensez à utiliser [varargs] (http://download.oracle.com/javase/1.5.0/docs/guide/language/varargs.html) 'Object ...' au lieu de 'Object []'. – BalusC

1

Encore mieux, n'implémentez pas du tout cette méthode. Utilisez logback ou un autre cadre de journalisation moderne.

0

Si vous écrivez un wrapper sur les frameworks de consignation existants, ils fournissent déjà un moyen d'imprimer le nom de la méthode dans le message du journal - si c'est ce que vous essayez d'implémenter.

Vous pouvez lire la documentation log4j, par exemple, que cette extraction (comme l'autre réponse indique) est fait à partir de la trace de la pile et est cher: http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html