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 :

[Reflexion][JDK 5.0] Puis-je pallier à getMethods() qui ne renvoie pas les méthodes dans l'ordre du source?


Sujet :

Langage Java

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    607
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 607
    Points : 671
    Points
    671
    Par défaut [Reflexion][JDK 5.0] Puis-je pallier à getMethods() qui ne renvoie pas les méthodes dans l'ordre du source?
    Bonjour,


    J'utilise l'API de reflexion de Java pour pour énumérer des méthodes que je dois tester.

    D'après leurs codes sources, mes classes présentent ces fonctions dans cet ordre:
    C1: A, B, C, login, D, E, F, logout

    C2: login,G,logout.

    Alors, je dresse la liste de mes classes et toutes les méthodes je les analyse puis je les lance.
    Mais voilà: getClass().getMethods() me piège.


    Quand mon traitement fait un C1.getMethods() elle les donne dans l'ordre du source: A, B, C, login, D, E, F, logout

    Puis, en faisant un C2.getMethods(), il reçoit un ordre qui ne convient pas: login, logout, G.


    Si je permute mes classes j'aurais:
    C2 ==> login,G,logout.
    mais C1 ==> login, logout, A, B, C, D, E, F


    Si je renomme login et logout dans la deuxième classe en login2 et logout2, je ne rencontrerai plus le problème et je recevrai:
    C1: A, B, C, login, D, E, F, logout

    C2: login2,G,logout2.

    Mais ce n'est pas satisfaisant.


    Je sais que le JDK 6.0 assure que l'ordre du source est respecté, à présent, par getMethods(). Mais pour ma part, je ne peux y accéder pour le moment, notre logiciel étant basé sur la version 5.0.

    Ai-je une possibilité de retrouver l'ordre du source à travers la reflexion ou tout autre moyen?


    Cordialement,

    Grunt.

  2. #2
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 571
    Points : 15 538
    Points
    15 538
    Par défaut
    J'aie bien peur que non.

    Est ce que ce serait gênant pour toi de numéroter l'ordre de tes méthodes avec des annotation?

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Ne serait-il pas plus simple de :
    - appeler login au début
    - appeler tout ce qui n'est pas login ou logout
    - appeler logout à la fin

    ?

  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par grunt2000 Voir le message
    Je sais que le JDK 6.0 assure que l'ordre du source est respecté, à présent, par getMethods().
    D'où tiens-tu cette information ? Car dans la doc de getMethods() on peut lire ceci :
    The elements in the array returned are not sorted and are not in any particular order.
    a++

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    607
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 607
    Points : 671
    Points
    671
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    D'où tiens-tu cette information ? Car dans la doc de getMethods() on peut lire ceci :


    a++
    J'ai peut être simplifié un peu vite ce que j'ai lu. Voici la discussion que j'ai lue.

    In JDK 6, JSR 269 in javac has superseded apt and should be preferred for new annotation processing work. The JSR 269 API provides more guarantees regarding ordering; javax.lang.model.TypeElement states

    "Each method of this interface that returns a list of elements will return them in the order that is natural for the underlying source of program information. For example, if the underlying source of information is Java source code, then the elements will be returned in source code order."



    Cela dit, ça n'assure rien de la réalité de la chose.

    Pour être sûr du bon ordre, que faut-il que je fasse?
    Que je lise le binaire de la classe d'après le class file format, en escomptant que l'ordre d'apparition dans le code source je l'y trouverait quelque-part?

    Humm!!! Ca va être le début du salon du bricolage, ça...
    Mais il faudrait que je trouve une solution tout de même. Le hasard ne peut pas se mêler de l'ordre des fonctions!

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Tu peux toujours rajouter un tableau qui contiendra les noms des méthodes dans l'ordre que tu veux!

  7. #7
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par grunt2000 Voir le message
    J'ai peut être simplifié un peu vite ce que j'ai lu. Voici la discussion que j'ai lue.

    In JDK 6, JSR 269 in javac has superseded apt and should be preferred for new annotation processing work. The JSR 269 API provides more guarantees regarding ordering; javax.lang.model.TypeElement states

    "Each method of this interface that returns a list of elements will return them in the order that is natural for the underlying source of program information. For example, if the underlying source of information is Java source code, then the elements will be returned in source code order."
    Attention car il est question ici de l'API javax.lang.model et non pas de l'API de réflection !

    Cette API permet d'obtenir des informations sur les classes à partir du code source. C'est principalement utilisé par l'Annotation processing introduit en standard dans Java 6...



    Quel est ton but précis ? Lancer les tests dans l'ordre de déclaration de la méthode ? La solution de thelvin ne convient-t-elle pas ?

    a++

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    607
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 607
    Points : 671
    Points
    671
    Par défaut
    Mon problème est que je suis pas le créateur du code de test, mais celui de l'environnement dans lesquels ils vont être lancés.

    Donc, le nombre et l'ordre des méthodes qui s'y trouveront, je n'en sais rien d'avance. J'ai pris login et logout pour exemple, mais pour des suites de tests multiples, on peut très bien imaginer que ce soit un autre cas de test "avec un nom qui revient souvent".

    La solution de thelvin ne convient pas car de toutes façons, le symtôme est que tout ce qui a été trouvé dans une classe une fois revient toujours en tête de liste s'il est retrouvé une seconde fois dans une autre classe.

    De sorte que lorsque qu'il propose de faire.
    login
    ... autres tests ...
    logout

    Cela ne fonctionnera pas car à la deuxième classe détentrice il aura immédiatement:
    login
    logout
    ... autres tests ...


    Mais surtout, donc, je n'ai pas la main sur le code de test!
    Forcer une annotation de séquence est possible, c'est vrai, et risque d'être l'ultime solution... Mais c'est vraiment pas très beau.

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Citation Envoyé par grunt2000 Voir le message
    De sorte que lorsque qu'il propose de faire.
    login
    ... autres tests ...
    logout

    Cela ne fonctionnera pas car à la deuxième classe détentrice il aura immédiatement:
    login
    logout
    ... autres tests ...
    Ben non, ce que je dis c'est de faire

    login
    ... autres tests ...
    logout

    indépendamment de l'ordre. Par conséquent, ma solution, si appliquée, ne peut pas faire autre chose -_-°.

    Mais à part ce passage, j'ai compris ce que tu voulais dire. Je conseille, moi aussi, les annotations.
    De toute façon compter sur l'ordre dans lequel les méthodes sont déclarées, ce n'est pas fameux non plus, les outils ne sont pas prévus pour qu'on s'impose ça.

Discussions similaires

  1. [MySQL] comment stocker puis recuper les images dans une base de donnée
    Par essono dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/11/2006, 23h07
  2. Réponses: 1
    Dernier message: 22/11/2006, 22h49
  3. Réponses: 1
    Dernier message: 02/11/2006, 10h40
  4. [JDK 5.0] Les méthodes isSynthetic() et isBridge() ???
    Par pitoubicou dans le forum Langage
    Réponses: 1
    Dernier message: 23/03/2006, 19h06
  5. Réponses: 20
    Dernier message: 23/03/2006, 16h21

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