Recherche sur le blog

lundi 27 février 2017

[Java] Appel de méthode avec l'API Reflection

Vous avez par exemple deux classes qui possèdent la même méthode (même nom, même signature) mais au moment de l'exécution, vous souhaitez choisir dynamiquement laquelle appeler à l'exécution. L'API Reflection permet d'effectuer cela de manière plutôt simple.

Supposons la classe suivante, "MaClasse1" dans laquelle on a écrit une fonction "getHello", qui prend en paramètres une chaine de caractère, et un nombre quelconque dans un objet de type Long. La fonction retournera C1= suivi du contenu de la chaine. Dans l'exemple nous n'afficherons pas le nombre passé en second paramètre.
public class MaClasse1 
{
  public String getHello(String text, Long nbTest)
  {
    return "C1=" + text;
  }
}
Nous créerons deux classes supplémentaires, appelées "MaClasse2" et "MaClasse3", qui implémenteront la même fonction en retournant cette fois C2 ou C3, tous deux suivis du contenu du paramètre.
Class laClasse = ...;
Object instClasse = laClasse.newInstance();
Class paramTypes[] = new Class[2];
paramTypes[0] = String.class;
paramTypes[1] = Long.class;
Method laMethode = laClasse.getMethod("getListeDestinataire",
  lo_parameterType);
Object paramVal[] = new Object[2];
paramVal[0] = ...;
paramVal[1] = 2L;
System.out.println(laMethode.invoke(instClasse, paramVal));
Ce qu'on a fait :
  • Instancier un objet de classe en spécifiant (par exemple, dans une fonction), la classe (ex : MaClasse1.class) ou avec Class.forName("Class FQN").
  • Créer un tableau contenant les types de paramètres. Ce sera un tableau de classes. Dans notre cas, ce sont des objets classiques, mais on peut aussi utiliser Class.forName().
  • On crée un objet de type Method, en utilisant getMethod() de l'objet Class (pas l'instance). On passe en paramètres le nom de la fonction, et le tableau de types.
  • Créer un tableau, cette fois qui contiendra des éléments Object. 
  • Spécifier les valeurs des paramètres.
  • Appeler la méthode invoke() de l'objet Method, avec en paramètres l'instance de la classe et les valeurs des différents paramètres. 
Ainsi, si on écrit :
 Class laClasse = MaClasse2.class;
 ...
 paramVal[0] = "test";
Lors de l'affichage, on obtiendra "C2=test".

Dans ce petit bout de code on a donné les valeurs aux différents objets en "dur"... Il ne vous reste plus qu'à adapter tout ça ;-) Bon amusement !

Aucun commentaire: