Ci-dessous un exemple simple d'utilisation de l'introspection ou reflexivité en java.
Tout d'abord je récupère le nom de ma classe.
Je crée une variable objet qui va me permettre de stocker la nouvelle instance de cette classe.
Pour appeler une méthode, dans mon cas, la méthode s'appelle, "setIdentifiant" et a pour parametre un "String". Il faut donc créer deux tableauxqui vont contenir
Nous pouvons maintenant appeler(ou invoquer )la méthode en lui passant en paramètre notre objet et la liste des valeurs de la méthode.
Pour aller plus loin, il faut savoir que l'appel d'une méthode par introspection est plus lourd qu'un appel direct.
Mais celà est à relativiser, vous trouverez dans ce lien, le différence du cout d'appel à une méthode par introspection et sans introspection, ainsi que sur un serveur et une machine simple :
http://buzdin.blogspot.fr/2011/01/is-java-reflection-really-slow.html
Tout d'abord je récupère le nom de ma classe.
Je crée une variable objet qui va me permettre de stocker la nouvelle instance de cette classe.
Pour appeler une méthode, dans mon cas, la méthode s'appelle, "setIdentifiant" et a pour parametre un "String". Il faut donc créer deux tableauxqui vont contenir
- la liste de types des paramètres (String.class ici)
- la liste des valeurs des paramètres ("test" ici)
Nous pouvons maintenant appeler(ou invoquer )la méthode en lui passant en paramètre notre objet et la liste des valeurs de la méthode.
//Récupération du nom de classe(avec le package)
String nomClasse=MaClasse.class.getCanonicalName();
Object monObjet = null;
Class c = Class.forName(nomClasse);
// Instanciation d'un nouvel objet de cette classe
monObjet = c.newInstance();
// Tableau contenant les types des arguments
Class[] paramTypes = new Class[1];
// Tableau contenant les valeurs des arguments
Object[] arg = new Object[1];
// Appel de la méthode
paramTypes[0] = String.class;
Method m = c.getMethod("setIdentifiant", paramTypes);
arg[0] = "test";
//Invocation de la méthode
m.invoke(monObjet, arg);
String nomClasse=MaClasse.class.getCanonicalName();
Object monObjet = null;
Class c = Class.forName(nomClasse);
// Instanciation d'un nouvel objet de cette classe
monObjet = c.newInstance();
// Tableau contenant les types des arguments
Class[] paramTypes = new Class[1];
// Tableau contenant les valeurs des arguments
Object[] arg = new Object[1];
// Appel de la méthode
paramTypes[0] = String.class;
Method m = c.getMethod("setIdentifiant", paramTypes);
arg[0] = "test";
//Invocation de la méthode
m.invoke(monObjet, arg);
Pour aller plus loin, il faut savoir que l'appel d'une méthode par introspection est plus lourd qu'un appel direct.
Mais celà est à relativiser, vous trouverez dans ce lien, le différence du cout d'appel à une méthode par introspection et sans introspection, ainsi que sur un serveur et une machine simple :
http://buzdin.blogspot.fr/2011/01/is-java-reflection-really-slow.html
Aucun commentaire:
Enregistrer un commentaire