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

API standards et tierces Java Discussion :

[Reflection] Connaître le nom d'une variable ...


Sujet :

API standards et tierces Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 23
    Points
    23
    Par défaut [Reflection] Connaître le nom d'une variable ...
    ... pendant l'execution d'un programme.

    Voilà, en fait, j'ai disons une variable membre de classe String variable = "quelquechose", et j'aimerai savoir s'il y a un moyen simple de connaître le nom de cette variable c'est à dire variable et non sa valeur c'est à dire quelquechose, pendant l'exe d'un programme Java.

    J'utilise ensuite le nom de la variable pour comparer avec des données en table.

    merci.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 75
    Points : 92
    Points
    92
    Par défaut
    Salut,

    Bon, tu veux faire de l'introspection...
    Pour récupérer tous les champs de ta classe, tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Class taClasse = Class.forName("NomDeTaClasse");
    Field[] tesChamps = taClasse.getDeclaredFields();
    Class.forName("NomDeTaClasse") te permet de récupérer l'objet Class de ta classe. Cet objet décrit ta classe.
    taClasse.getDeclaredFields() te permet de récupérer les champs déclarés sur ta classe.

    Voilà. Il doit y avoir un try{}catch(){} à mettre quelque part, à toi de le rajouter!

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 23
    Points
    23
    Par défaut
    Non c'est pas tout à fait ça, je me suis mal exprimé, je vais donc prendre un chti exemple:

    Déclaration d'une hypothétique classe / avec ommission constructeur(s)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class ClassTest
    {
          private String varTest = "valeur de varTest";
     
          public String getVarName(Object o);
    }
    Définition de la méthode getVarName

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public String getVarName(Object o)
    {
      //on ne peut pas utiliser getDeclaredFields(String), car c'est justement  le  paramètre String que l'on cherche 
      //on ne peut pas non plus utiliser getDecharedFields(), car on n'a aucun moyen de vérifier si le Field récupéré correspond bien à celui de l'objet o, sauf si on a un seul champ déclaré, ce qui ne sera jamais le cas me concernant.
    }
    Lors de l'appel de getVarName avec en paramètre varTest, on obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String leNomDeVar = getVarName(this.varTest);
    avec valeur de leNomDeVar == "varTest".

    Comment fait-on ?

    Balises [Code] rajoutée par Ricky81
    Merci d'y penser à l'avenir

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 856
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Bonjour,

    ma proposition (j'ai tout mis en public pour avoir un exemple simple, tu sauras adapter je pense ) :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    public class ClassTest 
    {
      public String varTest = "valeur de varTest";
      public Double vardeTest = new Double(3);
     
      public ClassTest()
      {
      }
     
      public String getVarName(Object o) throws java.lang.IllegalAccessException
      {
        Field[] f = this.getClass().getFields();
        for(int i=0;i<f.length;i++)
        {
          if(o.equals(f[i].get(this))) // elle est ici l'astuce
          {
            return f[i].getName();
          }
        }
        return "";
      }
     
      public static void main(String[] args)
      {
        ClassTest classTest = new ClassTest();
        try
        {
          String t = classTest.getVarName(classTest.varTest);
          System.out.println(t);
        }
        catch (IllegalAccessException e)
        {
          System.out.println("erreur");
        }
      }
    }
    [Edit]
    Attention, tu n'auras pas un bon fonctionnement si tu as plusieurs champs ayant la même valeur. En effet, on teste ici la valeur du champ, avec le prototype de la méthode donnée il est impossible de faire un test plus précis (je pourrais très bien mettre "valeur de varTest" à la place de classTest.varTest).
    Il faudrait revoir ta manière de faire pour pouvoir vraiment récupérer le bon objet Field...
    [/Edit]

    En espérant t'avoir aidé

    Pour comprendre le fonctionnement de la méthode get : http://ricky81.developpez.com/tutori...reflection/#L4

    Eric.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Tu ne peu pas de cette manière récupérer le "nom" d'une variable.
    Une fois le bytecode généré, les noms des variables disparaissent et sont remplacés par des 'sortes' d'adresse anonymes.

    Elle sont récupérables en mode 'débug' seulement me semble t'il mais il te faudras jouer avec l'api de débug à savoir celui de la JVM à savoir aussi, l'API qui vas radicalement changer en jdk 1.5.

    Essaye peut etre du coté de l'AOP ( programmation orientée aspect )
    -> AspectJ entre autre !
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 23
    Points
    23
    Par défaut
    Effectivement, après avoir l'api java.lang.reflec dans tous les sens, on ne peut pas faire ce type de chose. Je vais être obligé de faire autrement.

    Merci à tous ...

  7. #7
    duj
    duj est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2003
    Messages : 141
    Points : 474
    Points
    474
    Par défaut
    Nonon, aussi étrange que cela puisse paraître, les noms de variables sont conservées dans le fichiers .class.

    La preuve, utilise un décompilateur, et tu verra que la classe décompilée contient les mêmes noms de variables.

    Par ailleur, l'API reflexion et l'exemple de Ricky81 prouvent que cela est possible, et pas eulement pour le debugging.

    D'autre part, quand on ouvre un fichier .class compilé avec javac avec un simple éditeur de texte, on retrouve le nom de ses variables dans le fichier.

    [edit]
    Ce que tu veut faire, toi, c'est trouver le nom d'une variable dont la valeur est passée en paramètre. Puisque cette valeur est copiée lors de l'appel de la methode, cela n'est pas possible sauf si tu fait comme le propose Ricky81.
    Parfois, Google fait des miracles

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 12
    Points
    12
    Par défaut [java.lang.reflect] Connaître le nom d'une variable ...
    Y'a pratiquement que du vrai dans tous ces messages mais c'est un peu fouillis, alors pour être clair et résumer tout ça :

    - les noms des membres d'une classe (attributs, champs, fields, appelez ca comme vous voulez) sont conservés dans la section "constant pool" d'un fichier .class ; c'est un ensemble de chaines de caractères et de références vers ces chaines. On peut les retrouver avec l'API java.lang.reflect très facilement.

    - les variables locales n'ont pas de noms dans les specifications de la JVM. Par exemple la JVM met une variable sur la pile d'exécution avec l'instruction "aload" suivie du numéro de la variable locale. Les paramètres d'une méthode sont des variables locales donc impossible de retrouver leur nom ! il existe cependant une exception...

    - lorsqu'une classe est compilée avec l'option de débuggage, le compilateur ajoute des symboles dans une section particulière des methodes d'un fichier .class (table des variables, table des numéros de lignes...etc.). C'est la seule exception qui permet de retrouver le nom d'un paramètre.

    Et pour finir je dirais que dès qu'on en vient à vouloir trouver des solutions bizarres à des problèmes bizarres eux aussi, il s'agit dans 99% des cas d'un problème de design...

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

Discussions similaires

  1. Module dont le nom est une variable
    Par Mr Hyde dans le forum Général Python
    Réponses: 11
    Dernier message: 26/02/2023, 20h39
  2. changer le nom d'une variable
    Par chet dans le forum Général Python
    Réponses: 1
    Dernier message: 11/08/2006, 11h12
  3. [Tableaux] Concaténation du nom d'une variable
    Par nebule dans le forum Langage
    Réponses: 11
    Dernier message: 18/05/2006, 11h30
  4. Réponses: 37
    Dernier message: 02/03/2006, 01h58
  5. Incrémenter le NOM d'une variable
    Par Mors_Ubyte dans le forum Access
    Réponses: 1
    Dernier message: 03/01/2006, 18h47

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