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

Refection : .getClass().getMethod(pMethodName, pParmMethod).getTypeParameters();

2 réponses
Avatar
KiKo
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.

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.




merci
Kiko.

<Code>
import java.lang.reflect.*;
/**
*
* @author Kiko
*/
public class XLFireSetText {
private String labelID;
private String labelVersion;
private String textSequence;
private Object targetObject;
private String methodName;
private Class<?>[] parmMethod;
private String targetParmName;
private Method method;
private boolean done=false;

/*----------------*/
/*- constructeur -*/
/*----------------*/
public XLFireSetText( String pLabelID,
String pLabelVersion,
String pTextSequence,
Object pTargetObject,
String pMethodName,
Class<?>[] pParmMethod,
String pTargetParmName)
throws NoSuchMethodException, IllegalArgumentException
{

//Check reflect
method = pTargetObject.getClass().getMethod(pMethodName,
pParmMethod);
//TypeVariable<?>[] var =
pTargetObject.getClass().getMethod(pMethodName,
pParmMethod).getTypeParameters();
TypeVariable<?>[] var = method.getTypeParameters();

System.out.println("method : " + method.getName() + "/" +
var.length);

for(int i=0; i<var.length; i++) {
System.out.println("var[" + i + "].getName() = " +
var[i].getName());

if(var[i].getName().compareTo(pTargetParmName) == 0) {
this.done = true;
System.out.println("done");
break;
}
}

if(!done) throw new IllegalArgumentException("Invalid target
parametter name !");

this.labelID = pLabelID;
this.labelVersion = pLabelVersion;
this.textSequence = pTextSequence;
this.targetObject = pTargetObject;
this.methodName = pMethodName;
this.parmMethod = pParmMethod;
this.targetParmName = pTargetParmName;

}


}
</Code>

2 réponses

Avatar
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
Avatar
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