Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Avoir les noms des parametres d'une methode par reflection, c'est possible ?

13 réponses
Avatar
Vincent Cantin
Bonjour,

Je suis en train d'ecrire un outil qui utilise la reflection pour presenter
a l'utilisateur le profil des methodes et champs d'une classe specifiee.
Dans la classe java.lang.reflect.Method il y a bien moyen d'obtenir la liste
des type des arguments d'une methode, mais je ne vois rien pour avoir les
noms des arguments. Est-ce que cette information est stockee dans le fichier
.class apres compilation ? Si non, y-at'il moyen de l'y inclure par une
option speciale ? et comment y acceder ?

Merci,
Vincent

10 réponses

1 2
Avatar
Isammoc
Je suis en train d'ecrire un outil qui utilise la reflection pour
presenter a l'utilisateur le profil des methodes et champs d'une
classe specifiee. Dans la classe java.lang.reflect.Method il y a bien
moyen d'obtenir la liste des type des arguments d'une methode, mais je
ne vois rien pour avoir les noms des arguments. Est-ce que cette
information est stockee dans le fichier .class apres compilation ? Si
non, y-at'il moyen de l'y inclure par une option speciale ? et comment
y acceder ?


Amha, et je ne suis pas spécialiste,
le langage se fout des noms des arguments, donc, il ne va pas les conserver
(souci d'optimisation) a part pour les différencier, mais là, à mon avis,
ils les renomment de facon incompréhensible à nos yeux...

Merci,
Vincent


De rien, vraiment de rien

Isammoc

Avatar
JScoobyCed
Isammoc wrote:

Dans la classe java.lang.reflect.Method il y a bien
moyen d'obtenir la liste des type des arguments d'une methode, mais je
ne vois rien pour avoir les noms des arguments. Est-ce que cette
information est stockee dans le fichier .class apres compilation ? Si
non, y-at'il moyen de l'y inclure par une option speciale ? et comment
y acceder ?



Amha, et je ne suis pas spécialiste,
le langage se fout des noms des arguments, donc, il ne va pas les conserver
(souci d'optimisation) a part pour les différencier, mais là, à mon avis,
ils les renomment de facon incompréhensible à nos yeux...



Je dirais que quelquepart les noms des champs sont conserves, selon le
mode de compilation. Par defaut d'ailleurs, cela doit etre le cas. En
effet, si je prend un simple decompiler (sur sourceforge, il y en a
quelques-uns) il me decompile mes classes et donne les bons noms pour
les parametres. Par contre, je ne suis pas sur que par Reflection ca se
fasse. Les decompilers (decompilateur, en FR, qui decompilatent :))
lisent le bytecode pour re-generer les sources, et rarement la reflection.
Maintenant, je ne sais pas exactement comment c'est fait, mais il y a
des sites qui doivent expliquer comment interpreter (traduire) le
bytecode en code source. J'ai cru comprendre qu'un set de valeurs
hexadecimales dans le bytecode a une signification unique (selon comment
c'est lu) et donc par mapping on peut traduire.

--
JScoobyCed
What about a JScooby snack Shaggy ? ... Shaggy ?!


Avatar
Isammoc
Amha, et je ne suis pas spécialiste,
le langage se fout des noms des arguments, donc, il ne va pas les
conserver (souci d'optimisation) a part pour les différencier, mais
là, à mon avis, ils les renomment de facon incompréhensible à nos
yeux...



Je dirais que quelquepart les noms des champs sont conserves, selon le
mode de compilation. Par defaut d'ailleurs, cela doit etre le cas. En
effet, si je prend un simple decompiler (sur sourceforge, il y en a
quelques-uns) il me decompile mes classes et donne les bons noms pour
les parametres. Par contre, je ne suis pas sur que par Reflection ca
se fasse. Les decompilers (decompilateur, en FR, qui decompilatent :))
lisent le bytecode pour re-generer les sources, et rarement la
reflection. Maintenant, je ne sais pas exactement comment c'est fait,
mais il y a des sites qui doivent expliquer comment interpreter
(traduire) le bytecode en code source. J'ai cru comprendre qu'un set
de valeurs hexadecimales dans le bytecode a une signification unique
(selon comment c'est lu) et donc par mapping on peut traduire.


Je m'incline!

--
Isammoc


Avatar
Black Myst
Vincent Cantin wrote:
Bonjour,

Je suis en train d'ecrire un outil qui utilise la reflection pour presenter
a l'utilisateur le profil des methodes et champs d'une classe specifiee.
Dans la classe java.lang.reflect.Method il y a bien moyen d'obtenir la liste
des type des arguments d'une methode, mais je ne vois rien pour avoir les
noms des arguments. Est-ce que cette information est stockee dans le fichier
.class apres compilation ? Si non, y-at'il moyen de l'y inclure par une
option speciale ?
Dans le .class, non

L'inclure avec une option de javac, non

Peu etre en ecrivant ton propre compiler, mais je connais assez le
format des fichiers class pour savoir si l'information ajoutable.

et comment y acceder ?


Demande le source


Merci,
Vincent




Avatar
Cédric Chabanois
Le nom des paramètres est conservé lorsqu'on compile en mode debug (-g).
Par contre ce n'est pas accessible par réflexion "simple".

Pour s'en persuader il suffit d'essayer un décompilateur tel que Jad ou
DJ Java Decompiler, on a bien les méthodes avec le nom des arguments.

Axis (client et serveur SOAP) se sert de cette possibilité pour
récupérer les noms des paramètres (à condition de compiler la classe en
mode debug)
Voir
http://cvs.apache.org/viewcvs.cgi/ws-axis/java/src/org/apache/axis/utils/bytecode/


Cédric

Vincent Cantin wrote:

Bonjour,

Je suis en train d'ecrire un outil qui utilise la reflection pour
presenter
a l'utilisateur le profil des methodes et champs d'une classe specifiee.
Dans la classe java.lang.reflect.Method il y a bien moyen d'obtenir la
liste
des type des arguments d'une methode, mais je ne vois rien pour avoir les
noms des arguments. Est-ce que cette information est stockee dans le
fichier
.class apres compilation ? Si non, y-at'il moyen de l'y inclure par une
option speciale ?


Dans le .class, non
L'inclure avec une option de javac, non

Peu etre en ecrivant ton propre compiler, mais je connais assez le
format des fichiers class pour savoir si l'information ajoutable.

et comment y acceder ?


Demande le source


Merci,
Vincent






Avatar
Black Myst
Cédric Chabanois wrote:
Le nom des paramètres est conservé lorsqu'on compile en mode debug (-g).
Par contre ce n'est pas accessible par réflexion "simple".

Pour s'en persuader il suffit d'essayer un décompilateur tel que Jad ou
DJ Java Decompiler, on a bien les méthodes avec le nom des arguments.

Axis (client et serveur SOAP) se sert de cette possibilité pour
récupérer les noms des paramètres (à condition de compiler la classe en
mode debug)
Voir
http://cvs.apache.org/viewcvs.cgi/ws-axis/java/src/org/apache/axis/utils/bytecode/


J'avais testé de tel outils, mais probablement en ayant compilé sans
l'option debug, donc jugé à tord de l'impossibilité de retrouvé les noms
des parametres.

Merci pour ce lien, j'ai regardé le source, c'est quand même relativment
imbuvable :-)


Cédric

Vincent Cantin wrote:

Bonjour,

Je suis en train d'ecrire un outil qui utilise la reflection pour
presenter
a l'utilisateur le profil des methodes et champs d'une classe specifiee.
Dans la classe java.lang.reflect.Method il y a bien moyen d'obtenir
la liste
des type des arguments d'une methode, mais je ne vois rien pour avoir
les
noms des arguments. Est-ce que cette information est stockee dans le
fichier
.class apres compilation ? Si non, y-at'il moyen de l'y inclure par une
option speciale ?



Dans le .class, non
L'inclure avec une option de javac, non

Peu etre en ecrivant ton propre compiler, mais je connais assez le
format des fichiers class pour savoir si l'information ajoutable.

et comment y acceder ?


Demande le source


Merci,
Vincent








Avatar
Vincent Cantin
Le nom des paramètres est conservé lorsqu'on compile en mode debug (-g).
Par contre ce n'est pas accessible par réflexion "simple".

Pour s'en persuader il suffit d'essayer un décompilateur tel que Jad ou
DJ Java Decompiler, on a bien les méthodes avec le nom des arguments.

Axis (client et serveur SOAP) se sert de cette possibilité pour
récupérer les noms des paramètres (à condition de compiler la classe en
mode debug)
Voir

http://cvs.apache.org/viewcvs.cgi/ws-axis/java/src/org/apache/axis/utils/bytecode/



Merci beaucoup pour l'info, apparemment la classe qui m'interesse serait
"ParamNameExtractor". Je vais y jeter un coup d'oeil plus approfondi plus
tard, quand recuperer le nom des parametres sera en haut de ma liste de
priorite (peut-etre dans un mois le temps de finir le reste >_<).

C'est quand meme dommage que la Java Team n'ait rien prevu pour ca dans leur
API : il permettent de laisser cette info dans les .class mais on ne peut
pas y acceder :-(

Vincent

Avatar
JScoobyCed
Vincent Cantin wrote:

Bonjour,

Je suis en train d'ecrire un outil qui utilise la reflection pour presenter
a l'utilisateur le profil des methodes et champs d'une classe specifiee.
Dans la classe java.lang.reflect.Method il y a bien moyen d'obtenir la liste
des type des arguments d'une methode, mais je ne vois rien pour avoir les
noms des arguments. Est-ce que cette information est stockee dans le fichier
.class apres compilation ? Si non, y-at'il moyen de l'y inclure par une
option speciale ? et comment y acceder ?

Merci,
Vincent




En suivant ce fil, j'ai donc regarde sur AXIS.
C'est assez bien fait, et effectivement c'est de la lecture de bytecode.
Leur classe ParamNameExtractor passe le contenu du fichier.class a la
classe ParamReader (qui extends leur ClassReader). Ensuite ca fait une
serie de lecture d'index et de code hexa qui transforme par UTF8 vers
ASCII retrouve le nom du parametre.
(Ok, c'est tres bref, mais c'est juste pour donner une idee, par un
cours de lecture de bytecode :) )
Si tu es interesse par leur travail tu seras comble.

--
JScoobyCed
What about a JScooby snack Shaggy ? ... Shaggy ?!

Avatar
Jérôme Serré
Et dans la classe Class ?

Signature ------------------------------------------------------------------
-------------- Jérôme Serré http://m.heid.free.fr/expander
"Vincent Cantin" a écrit dans le
message de news:
Bonjour,

Je suis en train d'ecrire un outil qui utilise la reflection pour
presenter

a l'utilisateur le profil des methodes et champs d'une classe specifiee.
Dans la classe java.lang.reflect.Method il y a bien moyen d'obtenir la
liste

des type des arguments d'une methode, mais je ne vois rien pour avoir les
noms des arguments. Est-ce que cette information est stockee dans le
fichier

.class apres compilation ? Si non, y-at'il moyen de l'y inclure par une
option speciale ? et comment y acceder ?

Merci,
Vincent




Avatar
Cédric Chabanois
Oui mais çà se comprend car l'information n'est présente qu'en mode debug.

En fait je te conseille de laisser la possibilité à l'utilisateur de
spécifier autrement le nom des paramètres (via un fichier de config par
exemple)

Cédric

Le nom des paramètres est conservé lorsqu'on compile en mode debug (-g).
Par contre ce n'est pas accessible par réflexion "simple".

Pour s'en persuader il suffit d'essayer un décompilateur tel que Jad ou
DJ Java Decompiler, on a bien les méthodes avec le nom des arguments.

Axis (client et serveur SOAP) se sert de cette possibilité pour
récupérer les noms des paramètres (à condition de compiler la classe en
mode debug)
Voir



http://cvs.apache.org/viewcvs.cgi/ws-axis/java/src/org/apache/axis/utils/bytecode/


Merci beaucoup pour l'info, apparemment la classe qui m'interesse serait
"ParamNameExtractor". Je vais y jeter un coup d'oeil plus approfondi plus
tard, quand recuperer le nom des parametres sera en haut de ma liste de
priorite (peut-etre dans un mois le temps de finir le reste >_<).

C'est quand meme dommage que la Java Team n'ait rien prevu pour ca dans leur
API : il permettent de laisser cette info dans les .class mais on ne peut
pas y acceder :-(

Vincent





1 2