Le but de cet exercice est se familiariser avec la notion de reflection,
pour cela on souhaite écrire un code qui permet d'afficher un objet au format
JSON, par exemple pour la classe
Person:
public class Person {
private final String firstName;
private final String lastName;
public Person(String firstName, String lastName) {
this.firstName = Objects.requireNonNull(firstName);
this.lastName = Objects.requireNonNull(lastName);
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
On va écrire la méthode
toJSON qui prend en paramètre une
Person
et renvoie une chaîne de caractères au format
JSON:
public static String toJSON(Person person) {
return
"{\n" +
" \"firstName\": \"" + person.getFirstName() + "\"\n" +
" \"lastName\": \"" + person.getLastName() + "\"\n" +
"}\n";
}
Mais on veut aussi que la méthode
toJSON puisse prendre en paramètre
un
Alien et renvoie aussi une chaîne de caractères au format
JSON,
nous risqons dupliquer du code.
public class Alien {
private final String planet;
private final int age;
public Alien(String planet, int age) {
if (age <= 0) {
throw new IllegalArgumentException("Too young...");
}
this.planet = Objects.requireNonNull(planet);
this.age = age;
}
public String getPlanet() {
return planet;
}
public int getAge() {
return age;
}
}
public class Main {
public static String toJSON(Person person) {
return
"{\n" +
" \"firstName\": \"" + person.getFirstName() + "\"\n" +
" \"lastName\": \"" + person.getLastName() + "\"\n" +
"}\n";
}
public static String toJSON(Alien alien) {
return
"{\n" +
" \"planet\": \"" + alien.getPlanet() + "\"\n" +
" \"members\": \"" + alien.getAge() + "\"\n" +
"}\n";
}
public static void main(String[] args) {
var person = new Person("John", "Doe");
System.out.println(toJSON(person));
var alien = new Alien("E.T.", 100);
System.out.println(toJSON(alien));
}
}
Et si l'on doit dupliquer le code de
toJSON à chaque fois que l'on veut
transformer en
JSON une nouvelle classe, c'est embêtant ...
A kitten dies each time you duplicate a bug !
Pour éviter l'hécatombe, on se propose d'écrire une seule méthode
toJSON
prenant un
Object en paramètre et utilisant la réflexion (
reflection en anglais)
pour trouver les propriétés à écrire au format
JSON.