Ce TD à pour but de comprendre l'intérêt de la réflexion et des annotations.
On souhaite écrire un code qui permet d'afficher un objet au format
JSON.
Sachant qu'il existe le record
fr.umlv.json.Person avec un prénom
(
firstName et un nom
lastName
import static java.util.Objects.requireNonNull;
public record Person(String firstName, String lastName) {
public Person {
requireNonNull(firstName);
requireNonNull(lastName);
}
}
Dans une classe
JSONPrinter, on peut écrire la méthode
toJSON qui prend en paramètre une
Person
et renvoie une chaîne de caractères au format
JSON:
package fr.umlv.json;
public class JSONPrinter {
public static String toJSON(Person person) {
return """
{
"firstName": "%s",
"lastName": "%s"
}
""".formatted(person.firstName(), person.lastName());
}
public static void main(String[] args) {
var person = new Person("John", "Doe");
System.out.println(toJSON(person));
}
}
Supposons maintenant qu'il existe un record
fr.umlv.json.Alien
avec un age
age et une planète
planet
import static java.util.Objects.requireNonNull;
public record Alien(int age, String planet) {
public Alien {
if (age < 0) {
throw new IllegalArgumentException("negative age");
}
requireNonNull(planet);
}
}
si l'on veut aussi pouvoir afficher un
Alien au format JSON, on va écrire
une autre méthode
toJSON dans la classe
JSONPrinter
public class JSONPrinter {
...
public static String toJSON(Alien alien) {
return """
{
"age": %s,
"planet": "%s"
}
""".formatted(alien.age(), alien.planet());
}
public static void main(String[] args) {
...
var alien = new Alien(100, "Saturn");
System.out.println(toJSON(alien));
}
}
Si l'on doit dupliquer le code de
toJSON à chaque fois que l'on veut
transformer en
JSON un nouveau record, c'est embêtant...
A kitten dies each time you duplicate a bug !
Pour éviter l'hécatombe, on se propose de modifier la classe
JSONPrinter, de commenter le code des deux méthodes
toJSON
et de les remplacer par une seule méthode
toJSON prenant un
Record en paramètre et
utilisant la réflexion (
reflection en anglais) pour trouver les composants du record à écrire au format
JSON.