Je souhaite utiliser la reflection pour appeler dynamiquement une methode
d'un objet dans le cadre d'un projet sur des labels.
En effet je souhaite appeler dynamiquement, par exemple, la méthode
"setText' d'un JLabel.
Seulement pour cette méthode il n'y a qu'un paramètre et j'imagine que cela
pourrait être diffèrent pour d'autre objet.
C'est pour cela que je passe en paramètre le nom du paramètre cible à
utiliser. Mais pour le moment dans l'état d'avancement de mon dev je me
heurte à un tableau vide renvoyé par la méthode getTypeParameters de la
class Method.
Dans la javadoc il est indiqué « Returns an array of length 0 if the
underlying generic declaration declares no type variables » qui semble être
la cause de mon souci.
Si quelqu'un pouvait m'expliquer ce que cela signifie et si il y a un autre
moyen de cibler le paramètre d'une méthode.
Je vous livre le petit code que j'ai réalisé pour tester.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Mayeul
KiKo wrote:
Bonjour,
Je souhaite utiliser la reflection pour appeler dynamiquement une methode d'un objet dans le cadre d'un projet sur des labels.
En effet je souhaite appeler dynamiquement, par exemple, la méthode "setText' d'un JLabel.
Seulement pour cette méthode il n'y a qu'un paramètre et j'imagine que cela pourrait être diffèrent pour d'autre objet.
Je suis à peu près certain que cette approche est une mauvaise idée. Une sorte de classe SetTextAdapter avec des méthodes comme :
public static void setText(Object o, String text) { throw new IllegalArgumentException(); } public static void setText(JLabel label, String text) { label.setText(text); } public void setText(JTextPane pane, String text) { pane.setText(text); } [etc]
serait sans doute plus adaptée.
C'est pour cela que je passe en paramètre le nom du paramètre cible à utiliser.
Les paramètres de méthodes n'ont pas de nom, en dehors de la commodité nécessaire à l'écriture du code source. Ce que je veux dire, c'est que les noms des paramètres d'une méthodes sont inutilisables avec la réflectivité. Seuls leurs types sont accessibles. Il n'y a donc aucune méthode permettant d'utiliser ces noms, et donc aucune méthode à laquelle les passer en paramètre.
Mais pour le moment dans l'état d'avancement de mon dev je me heurte à un tableau vide renvoyé par la méthode getTypeParameters de la class Method.
Cette méthode concerne l'utilisation des génériques. Elle informe sur les types paramétrés déclarés pour cette méthode. Exemples :
public Object[] toArray();
Il n'y a aucun type paramétré => tableau vide.
public <T> T[] toArray(T[] array);
Type paramétré T => tableau à un élément
public <K, V> Map<K, V> mapView(Class<K> keyType, Class<V> valueType);
Types paramétrés K et V => tableau à deux éléments.
Dans la javadoc il est indiqué « Returns an array of length 0 if the underlying generic declaration declares no type variables » qui semble être la cause de mon souci.
Comme expliqué, la cause du soucis est donc que cette méthode n'est pas ce que vous cherchez.
Si quelqu'un pouvait m'expliquer ce que cela signifie et si il y a un autre moyen de cibler le paramètre d'une méthode.
Method.getParameterTypes() donne la liste des paramètres de la méthode, dans l'ordre. Mais pas leurs noms, seulement leur type, et seulement sous forme d'objets Class. Renvoie un Class<?>[].
Method.getGenericParameterTypes() fait à peu près la même chose, mais avec information sur les génériques. Renvoie un Type[].
Je ne saisis pas bien à quoi cette information peut servir, par contre, puisqu'à ce point du programme, vous avez déjà choisi la méthode, et vous l'avez fait à l'aide de son nom et de ses paramètres. Autrement dit, c'est une information déjà connue, et je ne comprends pas quel problème vous essayez de résoudre.
-- Mayeul
KiKo wrote:
Bonjour,
Je souhaite utiliser la reflection pour appeler dynamiquement une methode
d'un objet dans le cadre d'un projet sur des labels.
En effet je souhaite appeler dynamiquement, par exemple, la méthode
"setText' d'un JLabel.
Seulement pour cette méthode il n'y a qu'un paramètre et j'imagine que cela
pourrait être diffèrent pour d'autre objet.
Je suis à peu près certain que cette approche est une mauvaise idée. Une
sorte de classe SetTextAdapter avec des méthodes comme :
public static void setText(Object o, String text) { throw new
IllegalArgumentException(); }
public static void setText(JLabel label, String text) {
label.setText(text); }
public void setText(JTextPane pane, String text) { pane.setText(text); }
[etc]
serait sans doute plus adaptée.
C'est pour cela que je passe en paramètre le nom du paramètre cible à
utiliser.
Les paramètres de méthodes n'ont pas de nom, en dehors de la commodité
nécessaire à l'écriture du code source.
Ce que je veux dire, c'est que les noms des paramètres d'une méthodes
sont inutilisables avec la réflectivité. Seuls leurs types sont accessibles.
Il n'y a donc aucune méthode permettant d'utiliser ces noms, et donc
aucune méthode à laquelle les passer en paramètre.
Mais pour le moment dans l'état d'avancement de mon dev je me
heurte à un tableau vide renvoyé par la méthode getTypeParameters de la
class Method.
Cette méthode concerne l'utilisation des génériques. Elle informe sur
les types paramétrés déclarés pour cette méthode. Exemples :
public Object[] toArray();
Il n'y a aucun type paramétré => tableau vide.
public <T> T[] toArray(T[] array);
Type paramétré T => tableau à un élément
public <K, V> Map<K, V> mapView(Class<K> keyType, Class<V> valueType);
Types paramétrés K et V => tableau à deux éléments.
Dans la javadoc il est indiqué « Returns an array of length 0 if the
underlying generic declaration declares no type variables » qui semble être
la cause de mon souci.
Comme expliqué, la cause du soucis est donc que cette méthode n'est pas
ce que vous cherchez.
Si quelqu'un pouvait m'expliquer ce que cela signifie et si il y a un autre
moyen de cibler le paramètre d'une méthode.
Method.getParameterTypes() donne la liste des paramètres de la méthode,
dans l'ordre. Mais pas leurs noms, seulement leur type, et seulement
sous forme d'objets Class. Renvoie un Class<?>[].
Method.getGenericParameterTypes() fait à peu près la même chose, mais
avec information sur les génériques. Renvoie un Type[].
Je ne saisis pas bien à quoi cette information peut servir, par contre,
puisqu'à ce point du programme, vous avez déjà choisi la méthode, et
vous l'avez fait à l'aide de son nom et de ses paramètres.
Autrement dit, c'est une information déjà connue, et je ne comprends pas
quel problème vous essayez de résoudre.
Je souhaite utiliser la reflection pour appeler dynamiquement une methode d'un objet dans le cadre d'un projet sur des labels.
En effet je souhaite appeler dynamiquement, par exemple, la méthode "setText' d'un JLabel.
Seulement pour cette méthode il n'y a qu'un paramètre et j'imagine que cela pourrait être diffèrent pour d'autre objet.
Je suis à peu près certain que cette approche est une mauvaise idée. Une sorte de classe SetTextAdapter avec des méthodes comme :
public static void setText(Object o, String text) { throw new IllegalArgumentException(); } public static void setText(JLabel label, String text) { label.setText(text); } public void setText(JTextPane pane, String text) { pane.setText(text); } [etc]
serait sans doute plus adaptée.
C'est pour cela que je passe en paramètre le nom du paramètre cible à utiliser.
Les paramètres de méthodes n'ont pas de nom, en dehors de la commodité nécessaire à l'écriture du code source. Ce que je veux dire, c'est que les noms des paramètres d'une méthodes sont inutilisables avec la réflectivité. Seuls leurs types sont accessibles. Il n'y a donc aucune méthode permettant d'utiliser ces noms, et donc aucune méthode à laquelle les passer en paramètre.
Mais pour le moment dans l'état d'avancement de mon dev je me heurte à un tableau vide renvoyé par la méthode getTypeParameters de la class Method.
Cette méthode concerne l'utilisation des génériques. Elle informe sur les types paramétrés déclarés pour cette méthode. Exemples :
public Object[] toArray();
Il n'y a aucun type paramétré => tableau vide.
public <T> T[] toArray(T[] array);
Type paramétré T => tableau à un élément
public <K, V> Map<K, V> mapView(Class<K> keyType, Class<V> valueType);
Types paramétrés K et V => tableau à deux éléments.
Dans la javadoc il est indiqué « Returns an array of length 0 if the underlying generic declaration declares no type variables » qui semble être la cause de mon souci.
Comme expliqué, la cause du soucis est donc que cette méthode n'est pas ce que vous cherchez.
Si quelqu'un pouvait m'expliquer ce que cela signifie et si il y a un autre moyen de cibler le paramètre d'une méthode.
Method.getParameterTypes() donne la liste des paramètres de la méthode, dans l'ordre. Mais pas leurs noms, seulement leur type, et seulement sous forme d'objets Class. Renvoie un Class<?>[].
Method.getGenericParameterTypes() fait à peu près la même chose, mais avec information sur les génériques. Renvoie un Type[].
Je ne saisis pas bien à quoi cette information peut servir, par contre, puisqu'à ce point du programme, vous avez déjà choisi la méthode, et vous l'avez fait à l'aide de son nom et de ses paramètres. Autrement dit, c'est une information déjà connue, et je ne comprends pas quel problème vous essayez de résoudre.
-- Mayeul
KiKo
>> Seulement pour cette méthode il n'y a qu'un paramètre et j'imagine que cela pourrait être diffèrent pour d'autre objet.
Je suis à peu près certain que cette approche est une mauvaise idée. Une sorte de classe SetTextAdapter avec des méthodes comme :
public static void setText(Object o, String text) { throw new IllegalArgumentException(); } public static void setText(JLabel label, String text) { label.setText(text); } public void setText(JTextPane pane, String text) { pane.setText(text); } [etc]
serait sans doute plus adaptée.
-- Mayeul
Oui vous avez raison, je partais dans quelque chose de confus. Avec une interface dont l'implementation d'une méthode <setText(String fireText)> laisse à l'utilisateur le choix d'utiliser n'importe quel objet. Merci à vous, Kiko
>> Seulement pour cette méthode il n'y a qu'un paramètre et j'imagine que
cela
pourrait être diffèrent pour d'autre objet.
Je suis à peu près certain que cette approche est une mauvaise idée. Une
sorte de classe SetTextAdapter avec des méthodes comme :
public static void setText(Object o, String text) { throw new
IllegalArgumentException(); }
public static void setText(JLabel label, String text) {
label.setText(text); }
public void setText(JTextPane pane, String text) { pane.setText(text); }
[etc]
serait sans doute plus adaptée.
--
Mayeul
Oui vous avez raison, je partais dans quelque chose de confus.
Avec une interface dont l'implementation d'une méthode <setText(String
fireText)> laisse à l'utilisateur le choix d'utiliser n'importe quel objet.
Merci à vous,
Kiko
>> Seulement pour cette méthode il n'y a qu'un paramètre et j'imagine que cela pourrait être diffèrent pour d'autre objet.
Je suis à peu près certain que cette approche est une mauvaise idée. Une sorte de classe SetTextAdapter avec des méthodes comme :
public static void setText(Object o, String text) { throw new IllegalArgumentException(); } public static void setText(JLabel label, String text) { label.setText(text); } public void setText(JTextPane pane, String text) { pane.setText(text); } [etc]
serait sans doute plus adaptée.
-- Mayeul
Oui vous avez raison, je partais dans quelque chose de confus. Avec une interface dont l'implementation d'une méthode <setText(String fireText)> laisse à l'utilisateur le choix d'utiliser n'importe quel objet. Merci à vous, Kiko