:: Enseignements :: ESIPE :: E4INFO :: 2019-2020 :: Java Inside ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) |
Invocation API java.lang.invoke
|
Lookup, MethodHandle
Exercice 1 - MethodHandle
Le but de cet exercice est se familiariser avec la notion the method handle.
En Java, il existe deux APIs pour effectuer des appels de méthode de façon
réflexif, l'API de reflection (java.lang.reflect.Method.invoke) disponible
depuis la version 1.1 de Java et l'API d'invocation (java.lang.invoke.MethodHandle.invokeExact)
disponible depuis la version 7 de Java.
public class Example {
private static String aStaticHello(int value) {
return "question " + value;
}
private String anInstanceHello(int value) {
return "question " + value;
}
}
-
Dans le répertoire java-inside, utiliser Maven pour générer les fichiers pour le lab3
mvn archetype:generate \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DgroupId=fr.umlv.java.inside \
-DartifactId=lab3 \
-DinteractiveMode=false
Recopier les properties, dependencies et les plugins de build du pom.xml
du lab précédent.
-
Créer un projet Eclipse/IntelliJ pointant sur le répertoire lab3 et configurer votre IDE.
-
Dans une classe de test JUnit 5 ExampleTests, écrire un test permettant
de récupérer la méthode aStaticHello par reflection puis d'appeler
celle-ci.
Puis ajouter un autre test qui appele la méthode anInstanceHello.
-
On souhaite ajouter deux nouveaux test qui appel aStaticHello
et anInstanceHello mais en utilisant l'API d'invocation à la place
de l'API de reflection.
A quoi sert la classe Lookup ?
Comment créer une instance de cette classe ?
A quoi sert la méthode privateLookupIn
dans la classe MethodHandles ?
Sachant qu'il existe les méthodes
findStatic sur un Lookup
et
invokeExact
sur un MethodHandle,
ajouter un test qui appel la méthode aStaticHello.
Si il y a des erreurs bizarres RTFM !
-
Créer au autre test qui utilise l'API d'invocation pour appeler la méthode d'instance anInstanceHello
en utilisant
Lookup.findVirtual.
-
A quoi sert la méthode MethodHandles.insertArguments() ?
Utiliser la méthode MethodHandles.insertArguments pour créer à partir d'un MethodHandle créé sur
la méthode d'instance anInstanceHello un nouveau méthode handle dont l'argument est toujours 8.
Ecrire un test Junit permettant de tester ce nouveau method handle.
-
Comment utiliser MethodHandles.dropArguments ?
Ecrire un nouveau test vérifiant que dropArguments marche correctement.
Note: si vous vous demandez à quoi sert dropArguments dans la vrai vie, la réponse est dans la suite de l'exercice.
-
On veut utiliser l'un-boxing automatique pour que si l'on appel un method handle avec
un Integer, celui-ci soit transformer en int.
Ecrivez un test en utilisant la méthode d'instance
methodHandle.asType().
-
A quoi sert la méthode
MethodHandles.constant ?
Ecrire un nouveau test testant que la méthode MethodHandles.constant fonctionne correctement.
-
A quoi sert la méthode MethodHandles.guardWithTest ?
Ecrire un nouveau test testant que la méthode MethodHandle.guardWithTest fonctionne correctement
en créant un method handle qui renvoie 1 si le paramètre du méthode handle est bien égal (equals) à "foo"
et -1 sinon.
Note: attention target et fallback doivent avoir la même signature, donc il faut ajuster la signature
avec les méthodes handles que l'on a vu précédemmment.
-
Faire en sorte que Travis execute bien les tests du lab3.
© Université de Marne-la-Vallée