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 :

Interpreter une string comme une méthode


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Interpreter une string comme une méthode
    Bonjour à tous,

    Je souhaite imbriquer un getter dans un setter.

    Je m'explique :
    J'obtiens pas le biais d'une table de correspondance un string :
    String var = props.getProperty("1");

    A ce stade, var est égale à "livre.getTitre()".

    Je souhaite faire une manipulation du genre unObjet.setNom(var);

    Évidemment le nom de unObjet devient "livre.getTitre()" et non le titre de l'objet Livre instancié plus tôt.

    Existe-t-il un moyen de faire interpréter ma variable var non comme du texte mais comme du code ? Ou une autre méthode ?

    On m'a conseillé de passer par des méthodes de réflexivité mais je ne vois pas ce que cela peut m'apporter.

    Merci d'avance

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    Salut !

    Tu peux t'en sortir avec la réflectivité,
    Il faut déjà que tu travaille sur ta chaine pour conserver uniquement "getTitre"

    Ensuite tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Methode method = Livre.class.getMethod("getTitre",...)
    Puis pour terminer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String titre = (String)method.invoke(tonObjetLivre,...)
    Voilà ça fais longtemps que j'ai pas fait ça mais ça doit être un truc comme ça !!

  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 619
    Points
    21 619
    Par défaut
    Oui, mais le problème c'est que dans l'exemple donné, le mot livre représente une variable locale, et que la réflectivité ne peut pas accéder aux variables locales. Ni en fonction de leur nom, ni d'aucune façon.

    Donc, il n'est pas possible d'interpréter la chaîne complète "livre.getTitre()" par réflectivité.

    Je pense qu'il existe des APIs pour simplifier ce genre de besoins, mais jusqu'à maintenant on m'a toujours poussé à en développer une maison. Et c'est un peu long à présenter.
    Une idée pourrait être de considérer "livre.getTitre()" comme un langage de script et de démarrer un des moteurs de script de Java pour l'interpréter, en lui passant un contexte où "livre" est une variable globale désignant l'objet sur lequel on veut effectuer un traitement. Dans mes souvenirs, c'est un peu compliqué en comparaison du besoin assez simple.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    Avec la phrase : "le titre de l'objet Livre instancié plus tôt", j'avais pris en hypothèse qu'on savait déjà sur quel livre on travaillait à ce moment, mais si c'est pas le cas, effectivement ma solution n'est plus suffisante !

    Comment tu accède à tes livres en fait?

  5. #5
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    As-tu besoin d'interpréter n'importe quel String représentant un bout de code ou bien est-ce que tu as un besoin plus restreint? Il peut exister des solutions adaptées sans aller jusqu'à un moteur d'exécution de scripts.

    Dans quel contexte es-tu?
    Comment te retrouves-tu à devoir interpréter ce genre d'expression?

  6. #6
    Expert éminent sénior
    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
    Points : 48 807
    Points
    48 807
    Par défaut
    pareil, ce serait quand même beaucoup plus simple de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unObjet.setNom(livre.getLivre())
    plutôt que d'essayer de transformer java en un langage interprété qu'il n'est pas!


    Maitenant, il arrive dans certains cas particulier de devoir accéder à des méthodes par reflection sur base de leur nom. Dans ce genre de cas, tu as à disposition au choix

    commons-beansutils -> facilite la réflexivité
    beanshell -> interprétation de lignes de commande java au vol
    groovy -> pareil (jamais testé personnellement)
    des trucs comme les expression langage de javaEE5 -> permet uniquement l'accès aux getters setters

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci pour vos réponses.

    J'ai (finalement) obtenu un résultat satisfaisant avec la réflexivité.

    Method maMethode = livre.getClass().getMethod("getTitre");
    String string = maMethode.invoke(livre).toString();
    Et ensuite :
    unObjet.setNom(string);

    Du coup, je peux invoquer une méthode getTitre() puisque getMethod() accepte le string de ma table de correspondance.

    Je vois quand même qu'il y a d'autres manières de faire à explorer.
    Merci à tous !

  8. #8
    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 619
    Points
    21 619
    Par défaut
    Citation Envoyé par katarnos Voir le message
    Je vois quand même qu'il y a d'autres manières de faire à explorer.
    Euh, non. La reflectivité est insuffisante pour exploiter exactement "livre.getTitre()", c'est un fait. Mais si tu n'as pas besoin de tout ça et que la méthode que tu as retenue suffit, il vaut infiniment mieux s'y tenir.

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

Discussions similaires

  1. [XL-2010] Interpréter une string comme une formule dans VBA (pas cellule Excel)
    Par Quentin77170 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 09/05/2015, 23h04
  2. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  3. Interpreter le contenu d'une string comme de l'hexa
    Par thibal_kamehouse dans le forum C++
    Réponses: 4
    Dernier message: 30/11/2006, 17h46
  4. [C#] Comment Splitter une string avec une string ?
    Par ADJ Design dans le forum C#
    Réponses: 12
    Dernier message: 27/07/2006, 12h10
  5. Conseil sur l'extraction d'une string dans une string
    Par Mickey.jet dans le forum Delphi
    Réponses: 3
    Dernier message: 02/06/2006, 14h54

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