:: Enseignements :: ESIPE :: E4INFO :: 2019-2020 :: Java Inside ::
[LOGO]

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;
  }
}
   

  1. 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.
  2. Créer un projet Eclipse/IntelliJ pointant sur le répertoire lab3 et configurer votre IDE.
  3. 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.
  4. 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 !
  5. Créer au autre test qui utilise l'API d'invocation pour appeler la méthode d'instance anInstanceHello en utilisant Lookup.findVirtual.
  6. 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.
  7. 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.
  8. 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().
  9. A quoi sert la méthode MethodHandles.constant ?
    Ecrire un nouveau test testant que la méthode MethodHandles.constant fonctionne correctement.
  10. 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.
  11. Faire en sorte que Travis execute bien les tests du lab3.