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 :

Récupérer paramètres d'une méthode dans la pile


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Par défaut Récupérer paramètres d'une méthode dans la pile
    Bonjour

    je souhaiterai "remonter" la pile d'exécution afin de récupérer la valeur d'un paramètre lors de l'appel d'une méthode précédente.
    or par la stackTrace (Thread.currentThread().getStackTrace()[0]), je ne peux récupérer que le nom de la classe, le nom de la méthode voire le numéro de ligne au format chaine.

    Mais pas les valeurs des paramètres.

    Quelqu'un aurait-il une idée? Car ces valeurs existent bien dans la jvm...encore faut-ils qu'elles soient accessibles

    Merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Infaisable avec une JVM normale.

    D'ailleurs, ce n'est pas propre. Si tu veux que le paramètre soit dispo plus loin dans la pile d'appels, passe-le dans toute la pile, c'est tout.

    (Note : je comprends assez mal la programmation orientée aspect. Il est possible que ceci offre une autre manière de le faire que de passer le paramètre à chaque appel.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ouais mais bon, meme avec des aspect ca reste déclaratif (au niveau de aspect mais déclaratif quand même).

    Le seul cas ou c'est possible d'aller récupérer cette info, c'est quand le thread est mis en pause par un breakpoint via un debugger externe.

    Donc oui, à passer ou stocker quelque part.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Tu peux utiliser le débogger de ton EDI

  5. #5
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Par défaut
    Merci pour vos réponses.

    Malheureusement passer ce paramètre tout le long n'est pas possible;

    Pour préciser mon besoin, c'est une appli J2EE avec webservice d'un coté et BDD de l'autre.
    Dans l'application, on génère un identifiant unique par appel au webservice.

    Ce que je cherche à faire, c'est enrichir les logs lancés par Hibernate/Spring/cxf afin de visualiser cet identifiant dans la trace (j'utilise log4J pour tracer).

    Ma première idée a été d'étendre la classe d'org.apache.log4j.WriterAppender ou plutôt celui du org.apache.log4j.PatternLayout, en récupérant dans la pile, la valeur de cet identifiant (qui est présent dans tous les beans passés en paramètre).

    Innocemment, je ne pensais pas que ce serait si compliqué. Comment fait le debugger de mon EDI (Eclipse en l'occurrence) pour avoir accès à ces valeurs? Si lui peut les voir, on doit pouvoir y accéder, non?
    J'étais persuadé qu'il existait une classe/méthode dans le package java qui permettait ce genre de chose mais dont je ne connaissais pas l'existence...

    Si vous avez une autre idée, je suis aussi preneur

  6. #6
    Membre émérite Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Par défaut
    Il suffit de passer, lors de l'initialisation du log ou après, cet identifiant à la classe qui logge, aucun besoin de faire un truc aussi tordu que d'aller chercher dans la pile ; d'autant que cette pile toute complète avec les n° de ligne et tout n'existe que si le compilateur est mis en mode "debug" ; quand ce n'est pas le cas, ou pire, que le code est obfusqué, ça ne marchera peut-être pas aussi bien, je ne sais pas s'il y a des garanties là-dessus, en tout cas.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Par défaut
    Je n'ai pas accès à l'initialisation du log vu que cette initialisation se fait dans les classes Hibernate/cxf/Spring.
    A moins que je n'ai pas saisi ce que tu voulais dire...

  8. #8
    Membre émérite Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Par défaut
    Mais euh, tu ne peux pas faire une sous-classe ?

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    log4j a déjà un mécanisme pour associer des informations supplémentaire de ce style, c'est le mapped diagnostic contexts. tu y stoke une valeur jusqu'à suppression, et tu demande au logs de l'afficher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MDC.put("userId", userId);
    try{
    // appels à divers trucs
    } finally {
        MDC.clear("userId");
    }
    et dans ta pattern, par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %d %-5p [%c] (%X{userId}) %m%n

  10. #10
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Par défaut
    et ben voilà, c'est exactement mon besoin.

    Merci de m'avoir rafraichi la mémoire...vu que je l'avais déjà utilisé dans d'autres applications ...

    comment ne pas y avoir repensé plus tôt ^^

    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Framework] Récupérer le contenu des paramètres d'une méthode
    Par ep31 dans le forum Spring
    Réponses: 1
    Dernier message: 25/05/2012, 18h53
  2. [2.x] Récupérer les variables d'une méthode dans un layout
    Par guilhemsymf dans le forum Symfony
    Réponses: 4
    Dernier message: 01/03/2012, 10h52
  3. Réponses: 1
    Dernier message: 17/01/2011, 19h24
  4. Description paramètre d'une méthode dans intellisense
    Par SoAdAnTe dans le forum Visual Studio
    Réponses: 2
    Dernier message: 04/01/2011, 12h09
  5. Réponses: 2
    Dernier message: 11/05/2010, 13h15

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