OVH Cloud OVH Cloud

eval sous Java ?

12 réponses
Avatar
Cenekemoi
Bonjour,

en Javascript, on peut connaître le contenu d'une variable globale par
(au moins) deux méthodes :

soit :
maVariable = "toto";
nomVariable = "maVariable";

En javascript, on peut faire :
alert( eval( nomVariable ); ==> affiche "toto"
ou (mieux) :
alert( window[ nomVariable ]); ==> affiche "toto" (équivalent à
window.maVariable)

Y a-t-il moyen (ou astuce) en Java d'avoir le même résultat, cad
connaître le contenu d'une variable globale à partir de son nom ?

Merci d'avance pour vos réponses...

--
Cordialement, Thierry ;-)

10 réponses

1 2
Avatar
François-Xavier GENDRIN
Bonjour,

en Javascript, on peut connaître le contenu d'une variable globale par
(au moins) deux méthodes :

soit :
maVariable = "toto";
nomVariable = "maVariable";

En javascript, on peut faire :
alert( eval( nomVariable ); ==> affiche "toto"
ou (mieux) :
alert( window[ nomVariable ]); ==> affiche "toto" (équivalent à
window.maVariable)

Y a-t-il moyen (ou astuce) en Java d'avoir le même résultat, cad
connaître le contenu d'une variable globale à partir de son nom ?

Merci d'avance pour vos réponses...


Pour une classe on a :
Object o = new Object();
o.getClass().getDeclaredField("nomField").getBoolean(o);

Avatar
Vincent Cantin
Y a-t-il moyen (ou astuce) en Java d'avoir le même résultat, cad
connaître le contenu d'une variable globale à partir de son nom ?


Il y a la reflection.

Voir java.lang.reflect.* et java.lang.Class

Avatar
Kupee
Bonjour,

en Javascript, on peut connaître le contenu d'une variable globale par
(au moins) deux méthodes :

soit :
maVariable = "toto";
nomVariable = "maVariable";

En javascript, on peut faire :
alert( eval( nomVariable ); ==> affiche "toto"
ou (mieux) :
alert( window[ nomVariable ]); ==> affiche "toto" (équivalent à
window.maVariable)

Y a-t-il moyen (ou astuce) en Java d'avoir le même résultat, cad
connaître le contenu d'une variable globale à partir de son nom ?

Merci d'avance pour vos réponses...


En java une variable globale n'existe pas.
tu peux implémenter un truc comme ca avec une Map dans un champ static
d'une classe, tu met en clef son nom et en valeur sa valeur mais c'est
vraiment crade comme programmation

Avatar
Pierre Gilquin
tu peux faire un dictionnaire (HashMap) avec la clef correspondant au nom de
la variable ...

"Cenekemoi" a écrit dans le message de news:
4433d840$0$21287$
Bonjour,

en Javascript, on peut connaître le contenu d'une variable globale par (au
moins) deux méthodes :

soit :
maVariable = "toto";
nomVariable = "maVariable";

En javascript, on peut faire :
alert( eval( nomVariable ); ==> affiche "toto"
ou (mieux) :
alert( window[ nomVariable ]); ==> affiche "toto" (équivalent à
window.maVariable)

Y a-t-il moyen (ou astuce) en Java d'avoir le même résultat, cad connaître
le contenu d'une variable globale à partir de son nom ?

Merci d'avance pour vos réponses...

--
Cordialement, Thierry ;-)


Avatar
Cenekemoi
En java une variable globale n'existe pas.


j'entendais "globale dans une classe", bien sûr...

tu peux implémenter un truc comme ca avec une Map dans un champ static
d'une classe, tu met en clef son nom et en valeur sa valeur mais c'est
vraiment crade comme programmation


Toutafé, Kupee ;-)

De plus, je ne désire pas changer tout le code existant...

--
Cordialement, Thierry ;-)

Avatar
Cenekemoi
Y a-t-il moyen (ou astuce) en Java d'avoir le même résultat, cad
connaître le contenu d'une variable globale à partir de son nom ?


Il y a la reflection.

Voir java.lang.reflect.* et java.lang.Class


Oui, c'est effectivement très intéressant car on dispose des méthodes et
des "fields" d'une classe...mais pas des variables (publiques ou non),
hélas...

--
Cordialement, Thierry ;-)


Avatar
Cenekemoi
Bonjour à François-Xavier GENDRIN
Bonjour,

en Javascript, on peut connaître le contenu d'une variable globale
par (au moins) deux méthodes :

soit :
maVariable = "toto";
nomVariable = "maVariable";

En javascript, on peut faire :
alert( eval( nomVariable ); ==> affiche "toto"
ou (mieux) :
alert( window[ nomVariable ]); ==> affiche "toto" (équivalent à
window.maVariable)

Y a-t-il moyen (ou astuce) en Java d'avoir le même résultat, cad
connaître le contenu d'une variable globale à partir de son nom ?

Merci d'avance pour vos réponses...


Pour une classe on a :
Object o = new Object();
o.getClass().getDeclaredField("nomField").getBoolean(o);


Oui, merci, effectivement je dispose des noms des variables que je
cherche.
Maintenant, je ne vois pas comment connaître leur *contenu*. La méthode
toString() renvoie simplement le "nom complet" de la variable.

--
Cordialement, Thierry ;-)


Avatar
alexandre cartapanis
Bonjour à François-Xavier GENDRIN
Bonjour,

en Javascript, on peut connaître le contenu d'une variable globale
par (au moins) deux méthodes :

soit :
maVariable = "toto";
nomVariable = "maVariable";

En javascript, on peut faire :
alert( eval( nomVariable ); ==> affiche "toto"
ou (mieux) :
alert( window[ nomVariable ]); ==> affiche "toto" (équiva lent à
window.maVariable)

Y a-t-il moyen (ou astuce) en Java d'avoir le même résultat, cad
connaître le contenu d'une variable globale à partir de son nom ?

Merci d'avance pour vos réponses...


Pour une classe on a :
Object o = new Object();
o.getClass().getDeclaredField("nomField").getBoolean(o);


Oui, merci, effectivement je dispose des noms des variables que je cher che.
Maintenant, je ne vois pas comment connaître leur *contenu*. La mét hode
toString() renvoie simplement le "nom complet" de la variable.




Object obj = new Object();
Field fie = obj.getClass.getDeclaredField("nomField");
Object val = fie.get(obj);

L'idée c'est que tu passes une instance a ton field, et il vas récupé rer
la valeur POUR CETTE INSTANCE.
En effet, field est une classe qui indique les paramètre du champ (sa
classe "conteneur", son type, ...) mais pas la valeur, puisque la valeur
peut changer pour chaque instance. Il faut donc travailler avec une
instance. C'est ce que je fais ici, en passant au field une instance (de
la bonne classe naturellement).

Note bien que field.get(Object) renvoie un object, pour récupérer un
String par exemple, il te faudra faire du transtypage:

String val = (String)fie.get(obj);

Voila, bonne chance :)
--
Alexandre CARTAPANIS - Responsable Système et Réseau
Email
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kraëmer 13014 Marseille France
Tél. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email



Avatar
alexandre cartapanis
Bonjour à François-Xavier GENDRIN
Bonjour,

en Javascript, on peut connaître le contenu d'une variable globale
par (au moins) deux méthodes :

soit :
maVariable = "toto";
nomVariable = "maVariable";

En javascript, on peut faire :
alert( eval( nomVariable ); ==> affiche "toto"
ou (mieux) :
alert( window[ nomVariable ]); ==> affiche "toto" (équiv alent à
window.maVariable)

Y a-t-il moyen (ou astuce) en Java d'avoir le même résultat, cad
connaître le contenu d'une variable globale à partir de son nom ?

Merci d'avance pour vos réponses...


Pour une classe on a :
Object o = new Object();
o.getClass().getDeclaredField("nomField").getBoolean(o);


Oui, merci, effectivement je dispose des noms des variables que je
cherche.
Maintenant, je ne vois pas comment connaître leur *contenu*. La
méthode toString() renvoie simplement le "nom complet" de la variabl e.




Object obj = new Object();
Field fie = obj.getClass.getDeclaredField("nomField");
Object val = fie.get(obj);

L'idée c'est que tu passes une instance a ton field, et il vas récu pérer
la valeur POUR CETTE INSTANCE.
En effet, field est une classe qui indique les paramètre du champ (sa
classe "conteneur", son type, ...) mais pas la valeur, puisque la valeu r
peut changer pour chaque instance. Il faut donc travailler avec une
instance. C'est ce que je fais ici, en passant au field une instance (d e
la bonne classe naturellement).

Note bien que field.get(Object) renvoie un object, pour récupérer u n
String par exemple, il te faudra faire du transtypage:

String val = (String)fie.get(obj);

Voila, bonne chance :)


J'ai oublié quelque chose, pour les types standard (int, boolean, ...),
il faut utiliser la methode Field.getInt() ou Field.getBoolean() plutôt
que Field.get().

Note que c'est ce que faisait le code:
o.getClass().getDeclaredField("nomField").getBoolean(o);


Après, si le type est boolean et que tu utilises get(), peut être que la
VM fais un transtypage automatique en Boolean. Elle le fais déjà pour
les collections par exemple en version 1.5 (ça s'appel auto-boxing je
crois), mais je n'ai jamais tester avec la reflexion, a voir.


--
Alexandre CARTAPANIS - Responsable Système et Réseau
Email
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kraëmer 13014 Marseille France
Tél. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email




Avatar
Cenekemoi
Merci beaucoup à tous !

Voila une portion de code que j'ai finalement utilisé et qui peut être
utile à d'autres :

private void sendVar(String nomVariable) {
Object val;
try {

Field field = this.getClass().getDeclaredField(nomVariable);
val = field.get(this);
} catch (Exception e) {
return;
}
System.out.println( nomVariable +" = "+ val.toString() );
}

"nomVariable" doit être un nom de variable globale pour la classe "this"
considérée...

--
Cordialement, Thierry ;-)
1 2