Manipulation

Après la présenation de l'API, nous allons voir comment l'utiliser à travers des exmples concrets. Nous verrons également qu'il est possible d'outrepasser les règles d'encapsulation

Création d'un objet

La méthode newInstance() de la classe Class permet de créer une instance d'un objet en appelant le constructeur par défaut. Dans l'exemple qui suit, nous créons un objet de type Rectangle à partir du nom de la classe.

	

	

Pour pouvoir instancier un objet avec un constructeur autre que celui par défaut, il faut maintenant utiliser la classe Constructor. Pour ce faire, il faut utiliser la méthode getConstructor() d'un objet Class, en passant en paramètre un tableau de Class représentant les types des paramètres du constructeur dont on veut disposer. Puis il faut appeler la méthode newInstance de l'objet Constructor avec en paramètres un tableau d'objet contenant les paramètres.

	

	

Get sur un champ

L'objet Field propose la méthode Object get(Object o) qui permet de récupérer la valeur du champ (représenté par l'instance de Field) de l'objet passé en paramètre. Dans cet exemple, nous récupérons la valeur du champ height d'un rectangle.

	

	

Set sur un champ

L'objet Field propose la méthode Object set(Object o, Objet param) qui permet de changer la valeur du champ (représenté par l'instance de Field) de l'objet passé en paramètre, avec l'objet en second paramètre. Dans cet exemple, nous changeons la valeur du champ height d'un rectangle.

	

	

Invocation d'une méthode

La méthode Object invoke(Object arg0, Object... arg1) de la classe Method permet d'appeler la méthode de l'objet passé en premier argument, avec les paramètres passés ensuite. Pour ce faire, il faut tout d'abord récupérer l'objet Method à l'aide de getMethod(). Dans cet exemple, nous allons appeler la méthode concat de l'objet String, qui prendun String en paramètre.

	

	

Au delà de l'encapsulation

Dans toutes les manipulations faites jusqu'à présent, nous avons toujours touché à des champs ou des méthodes publiques. Les méthodes getFields(), getMethods(), ... revoient toujours les champs et les méthodes publiques. Mais il existe aussi des méthodes getDeclaredXXX() qui permettent de récupérer toutes les champs et toutes les méthodes d'une classe. Si nous essayons de les manipuler directement, une exception IllegalAccessException est levée. Pour contourner cela, nous avons accès à la méthode void setAccessible(boolean accessible). Cette méthode lève le verrou et permet donc d'accéder aux champs et méthodes non publiques.

L'exemple quivant illustre ce mécanisme. Pour illustrer, la classe PrivateFields contient 2 champs privés x et y, et une méthode privée doSomething()

	

	

L'exemple ci-dessous effectue les opérations suivantes:

	

	

Le résultat e l'exécution est donné ci-dessous:

	
x: 10, y: 10
Get sur x: 
java.lang.IllegalAccessException: Class manipulation.SampleSetPrivate can not access a member of class manipulation.PrivateFields with modifiers "private"
	at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
	at java.lang.reflect.Field.doSecurityCheck(Unknown Source)
	at java.lang.reflect.Field.getFieldAccessor(Unknown Source)
	at java.lang.reflect.Field.get(Unknown Source)
	at manipulation.SampleSetPrivate.main(SampleSetPrivate.java:68)
Get sur x après setAccessible: 10
Set sur x: 24
Appel de doSomething: 
java.lang.IllegalAccessException: Class manipulation.SampleSetPrivate can not access a member of class manipulation.PrivateFields with modifiers "private"
	at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at manipulation.SampleSetPrivate.method(SampleSetPrivate.java:30)
	at manipulation.SampleSetPrivate.main(SampleSetPrivate.java:100)
Appel de doSomething après setAccessible:
Qui m'appelle???
	

L'API autorise ce comportement car beaucoup d'applications doivent avoir accès à ces données, telles que:

Explorateur de classe

Pour finir, voici le code d'un explorateur de classe permettant d'afficher toutes les méthodes et tous les champs d'une classe donnée.