Bonjour
J'utilise la réflexion pour construire un interpréteur. J'ai par exemple deux méthodes parmi une centaine :
public void fonction35 (Enum quoi, int i, String s) { ...etc... }
public void fonction42 (Enum quoi, int i, String... s) { ...etc... }
L'appel de getMethods() sur la classe de l'interpréteur me permet de construire une table HashMap <String, Method> pour trouver les méthodes à partir de leur nom.
Lorsqu'une méthode "m" a été ainsi trouvée, l'appel de m.getGenericParameterTypes permet d'avoir un tableau de types ("Type") pour les paramètres.
Dans le cas de la méthode "fonction35", la taille de ce tableau est suffisante pour construire un tableau de paramètres afin d'appeler la méthode par m.invoke. Tout se passe bien si chaque paramètre dans ce tableau (Enum, (int), String) est rangé dans un Object [] sans se préoccuper de son type : m.invoke fait le tri à l'exécution.
Tout se complique avec "fonction42" et son dernier paramètre qui est un tableau de String. On ne peut pas se permettre de déclarer ce dernier comme un Object [] car m.invoke, à l'exécution attend vraiment un String [] et pas autre chose ! du moins c'est ce que j'ai compris. Alors il me faut donc instancier dynamiquement ce String [] à partir du dernier objet contenu dans le tableau m.getGenericParameterTypes ().
C'est là que je bloque. Comment instancier un tableau, de taille connue mais contenant des objets de types variés, grâce à un objet (une interface en fait) de type "Type" ?
Partager