IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Connaître l'appelant d'une méthode


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut Connaître l'appelant d'une méthode
    Bonjour,

    Je désire faire un fichier de Log. J'ai une classe et dedans une méthode dont j'aimerai enregistrer dans ce fichier de log les différentes étapes de son exécution. Jusque là pas de problème.

    Mais cette méthode pouvant être appelé de plusieurs endroits dans mon programme, j'aimerai retrouver qui l'a appelé (classe + méthode ou a la rigueur fichier source + ligne).

    En C++ on utilise les variables du compilateur __FILE__ et __LINE__, y'a des possibilités similaires en Java ? Le mieux serait __CLASS__ et __FUNCTION__

    Merci beaucoup,

    Aurélien

  2. #2
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Il faut fouiller dans la stack trace je pense...
    Mais pourquoi n'utilises-tu pas la classe Logger qui fait déjà ce que tu veux?

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Citation Envoyé par mister3957 Voir le message
    Bonjour,

    Je désire faire un fichier de Log. J'ai une classe et dedans une méthode dont j'aimerai enregistrer dans ce fichier de log les différentes étapes de son exécution. Jusque là pas de problème.

    Mais cette méthode pouvant être appelé de plusieurs endroits dans mon programme, j'aimerai retrouver qui l'a appelé (classe + méthode ou a la rigueur fichier source + ligne).

    En C++ on utilise les variables du compilateur __FILE__ et __LINE__, y'a des possibilités similaires en Java ? Le mieux serait __CLASS__ et __FUNCTION__

    Merci beaucoup,

    Aurélien
    __FILE__ et __LINE__ ne te permettent pas de connaitre l'appelant. D'ailleurs, il me semble que tu ne peux pas connaitre la pile d'appel, contrairement en java.

    Comme la dit ®om, essaie en priorité d'utiliser les API existantes (Logger, ou log4j).

    Sinon, il faut fouiller dans la pile (cf StackTraceElement, Exception, etc ...)

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Sanguko Voir le message
    __FILE__ et __LINE__ ne te permettent pas de connaitre l'appelant. D'ailleurs, il me semble que tu ne peux pas connaitre la pile d'appel, contrairement en java.
    En C tu ne peux pas connaitre la pile d'appel, mais en combinant __FILE__ et __LINE__ avec une macro pour appeler une fonction tu peux obtenir des infos sur la classe appelante...


    Citation Envoyé par Sanguko
    Comme la dit ®om, essaie en priorité d'utiliser les API existantes (Logger, ou log4j).
    +1 pour utiliser les solutions existante... tant qu'à faire

    Citation Envoyé par Sanguko
    Sinon, il faut fouiller dans la pile (cf StackTraceElement, Exception, etc ...)
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	public static void showCaller() {
    		StackTraceElement[] stack = Thread.currentThread().getStackTrace();
    		StackTraceElement caller = stack[2];
     
    		System.out.println(caller);
    		System.out.println("Nom de la classe  : " + caller.getClassName());
    		System.out.println("Nom de la méthode : " + caller.getMethodName());
    		System.out.println("Nom du fichier    : " + caller.getFileName());
    		System.out.println("Numéro de ligne   : " + caller.getLineNumber());
    	}
    Par contre la méthode getStackTrace() n'est apparut dans la classe Thread qu'avec Java 5.0. Pour les JDK plus anciens il suffit d'instancier un objet Throwable pour retrouver cette info :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StackTraceElement[] stack = new Throwable().getStackTrace();

    Par contre attention à bien laisser la possibilité de désactiver tout cela, car la génération du stacktrace est un peu couteuse et peu affecter les performances si elle est utiliser abusivement...

    a++

Discussions similaires

  1. Appel d'une méthode virtuelles
    Par BIPBIP59 dans le forum C++Builder
    Réponses: 4
    Dernier message: 24/03/2006, 14h00
  2. Réponses: 2
    Dernier message: 29/12/2005, 10h25
  3. Réponses: 2
    Dernier message: 06/12/2005, 09h41
  4. Réponses: 6
    Dernier message: 27/05/2005, 15h43
  5. Comment connaitre l'appelant d'une méthode
    Par Alec6 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 12/07/2004, 14h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo