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 myClass = ...;
Object instClasse = myClass.newInstance();
Class paramTypes[] = new Class[2];
paramTypes[0] = String.class;
paramTypes[1] = Long.class;
Method laMethode = myClass.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 myClass = MaClasse2.class;
// ...
paramVal[0] = "test";
Lors de l’affichage, on obtiendra « C1=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 !