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 :

Accéder une variable en utilisant son nom sous forme de String


Sujet :

Langage Java

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Points : 156
    Points
    156
    Par défaut Accéder une variable en utilisant son nom sous forme de String
    Salut,

    De curiosité, serais t-il possible d'accéder à une variable en utilisant son nom ?

    Par exemple, je pourrais avoir un String qui contient la chaîne "unNombre" et l'idée serais d'utiliser cela pour récupérer le contenu de la variable unNombre.

  2. #2
    Membre confirmé Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Points : 493
    Points
    493
    Par défaut
    Oui c'est possible par réflexion.
    http://java.sun.com/developer/techni...LT/Reflection/

  3. #3
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Citation Envoyé par djsnipe Voir le message
    Mouais, c'est possible uniquement pour des champs d'instances, en aucun cas pour des variables locales.

    Sinon Jimalexp, que dirais-tu d'utiliser plutôt une Map, qui est une collection stockant des paires <clé, valeur>.

    Exemple (Java version >= 1.5):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    //stockage des valeurs
     
    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("unNombre", 10);
     
    // des traitements
     
     
    //récupération des valeurs
     
    int unNombre = map.get("unNombre");
     
    //la variable vaut 10
    Est ce que cela ne répondrait pas à ton besoin?

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Deadpool Voir le message
    Mouais, c'est possible uniquement pour des champs d'instances, en aucun cas pour des variables locales.
    Tu voulais dire "variables static" ?

    Même pour une variable static, on peut récupérer la valeur par réflexion.
    Ci-joint un exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try
    {
        Field f = FtpConnection.class.getField("PORT_FTP");
        Object v = f.get(null); <- pour une propriété static, l'instance sinon
        System.out.println(v);
    }
    catch (Exception e)
    {
        System.out.println(e.getMessage());
    }
    Par contre, la propriété doit être public...

    A+

    EDIT:

    Ci-dessous une version avec une propriété private
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    try
    {
        Field f = FtpConnection.class.getDeclaredField("PORT_FTP");
        f.setAccessible(true);
        Object v = f.get(null);
        System.out.println(v);
    }
    catch (Exception e)
    {
        System.out.println(e.getMessage());
    }

  5. #5
    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 OButterlin Voir le message
    Tu voulais dire "variables static" ?
    Non non il parle bien des variables locales (à une méthode) : on ne peut pas les récupérer par réflexion.

    En même temps il n'y a pas vraiment d'intérêt à cela...

    Citation Envoyé par OButterlin Voir le message
    Par contre, la propriété doit être public...
    Pas forcément : la propriété doit être visible. cela respecte les mêmes règles de visibilité :
    • On a le droit d'accéder par réflexion à un élément private depuis une méthode de la même classe.
    • On a le droit d'accéder à un élément protected d'une classe parente.
    • On a le droit d'accéder à un élément protected ou "package-only" d'une classe du même package.
    • On a le droit d'accéder à un élément public de n'importe quelle classe



    Toutefois on peut passer outre ces règles en forçant le "setAccessible(true)" (cela nécessite des permissions avec un SecurityManager). [edit] comme tu le signales dans ton [edit]

    a++

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Non non il parle bien des variables locales (à une méthode) : on ne peut pas les récupérer par réflexion.
    Effectivement, c'était tellement incongru que je n'y ai même pas pensé
    (ça supposerait qu'on utilise la réflexion dans la méthode )

  7. #7
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Effectivement, c'était tellement incongru que je n'y ai même pas pensé
    (ça supposerait qu'on utilise la réflexion dans la méthode )
    Oui je parlais bien des variables locales, en fait, je ne savais pas à quel type de variable il voulait accéder, mais effectivement, c'est incongru.

  8. #8
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par Deadpool Voir le message
    Est ce que cela ne répondrait pas à ton besoin?
    Pas tout à fait, mais c'est une approche à utiliser avec les switch case. J'ai découvert récemment que switch en java n'accepte que les int.

    @OButterlin & adiGuba: Merci pour cette solution.

Discussions similaires

  1. Réponses: 10
    Dernier message: 09/12/2013, 11h27
  2. Utiliser contenu d'une variable et pas son nom..
    Par ehochedez dans le forum Langage
    Réponses: 3
    Dernier message: 03/09/2009, 11h19
  3. Réponses: 19
    Dernier message: 02/02/2009, 18h06
  4. Réponses: 6
    Dernier message: 19/01/2009, 12h57
  5. [EVAL] utiliser la valeur d'une variable à partir de son nom
    Par Julien Dufour dans le forum VBA Access
    Réponses: 0
    Dernier message: 24/04/2008, 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