require('func.php'); echoHeader('API Reflection'); ?>
L'API java.lang.reflect peut avant tout être utile pour l'introspection, c'est à dire la découverte des caractéristiques d'une classe (classe mère, champs, méthodes, ...). D'une utilité un peu plus avancée, elle permet d'instancier des classes de manière dynamique, en agissant sur ses champs, en appelant ses méthodes ...
La réflexion est également potentiellement intéressante pour l'écriture d'un générateur de code générique pour un ensemble de classe.
Cette API sert également dans le processus de sérialisation d'un bean Java ou dans la génération du code de création d'une table en base de données pour la persistance de la classe cible (ce qu'utilise toutes les APIs de mapping Objet/Relationnel).
Nous allons maintenant voir les classes que nous propose cette API, mais avant cela, nous allons voir la classe Class, qui ne fait partie à proporement parler de l'API, mais qui se revèle indspensable pour l'utiliser.
C'est la classe de base sur laquelle repose l'API reflect. En effet, dans toutes les classes et méthodes que nous rencontrerons plus tard, elle sera présente.
En ce qui concerne la réflection, voici les méthodes importantes qu'elle met à disposition:
Field getField(String name) | Renvoie un objet Field correspondant au champ "name" |
Field[] getFields() | Renvoie l'ensemble des champs publics sous la forme d'un tableau |
Method getMethod(String name, Class[] parameterTypes) | Renvoie un objet Method correspondant à la méthode "name" avec les paramètres définis par le tableau parameterTypes |
Method[] getMethods() | Renvoie l'ensemble des méthodes publiques sous la forme d'un tableau |
Constructor getConstructor(Class[] parameterTypes) | Renvoie un objet Constructor correspondant au constructeur avec les paramètres defines par le tableau parameterTypes |
Constructor[] getConstructors() | Renvoie l'ensemble des constructeurs sous la forme d'un tableau |
java.lang.Class[] getInterfaces() | Renvoie l'ensemble des interfaces implémentées |
java.lang.Class getSuperclass() | Renvoie la classe mère |
java.lang.Package getPackage() | Renvoie un objet Package correspondant au paquetage dans lequel se trouve la classe |
On constate bien que c'est à partir d'un objet de type Class que l'on peut récupérer les objets de l'API java.lang.reflect.
A noter que, pour des raisons de lisibilité, les noms de classes non préfixés par le paquetage complet appartiennent au paquetage java.lang.reflect.
Mettons en pratique quelques unes de ces méthodes:
require('src/beginning/SampleInterface.java');
?>
require('src/beginning/SuperClass.java');
?>
String getName() | Donne le nom du champ |
Class getType() | Donne le type du champ |
int getModifier() | Rentourne un entier représentant la visibilité du champ (private, protected, public). Permet également d'avoir d'autres informations comme static |
require('src/beginning/SampleField.java');
?>
Class[] getExceptionTypes() | Retourne un tableau contenant les classes Exception susceptibles d'être lancées |
String getName() | Doone le nom de la méthode |
Class getReturnType() | Retourne la classe du paramètre retourné par la méthode |
Class[] getParameterTypes() | Retourne un tableau contenant les classes des paramètres de la méthode |
int getModifiers() | Retourne un entier représentant la visibilité du champ (private, protected, public). Permet également d'avoir d'autres informations comme static |
require('src/beginning/SampleMethod.java');
?>
Class[] getExceptionTypes() | Retourne un tableau contenant les classes Exception susceptibles d'être lancées |
String getName() | Retourne le nom de la méthode |
Class[] getParameterTypes() | Retourne un tableau contenant les classes des paramètres de la méthode |
int getModifiers() | Retourne un entier représentant la visibilité du champ (private, protected, public). |
require('src/beginning/SampleConstructor.java');
?>
boolean static isFinal(int mod) | Détermine si le code transmis intègre la particularité "final" |
boolean static isStatic(int mod) | Détermine si le code transmis intègre la particularité "static" |
boolean static isAbstract(int mod) | Détermine si le code transmis intègre la particularité "abstract" |
boolean static isPublic(int mod) | Détermine si le code transmis intègre une visibilité "public" |
boolean static isProtected(int mod) | Détermine si le code transmis intègre une visibilité "protected" |
boolean static isPrivate(int mod) | Détermine si le code transmis intègre une visibilité "private" |
require('src/beginning/ClassModifier.java');
?>
echoFooter();
?>