Possibilité d'accéder au type générique en runtime
Un collègue vient de me montrer un truc très bizarre dans un code qu'il a fait et ça m'intrigue beaucoup.
Dans la certification que j'ai passé il n'y a pas très longtemps, ils insistaient bien sur le fait qu'aucune information sur les generics ne se retrouvait dans le bytecode compilé, et que par conséquent, on ne pouvait pas retrouver le type des éléments contenus dans une collection générique AU RUNTIME.
Pourtant, si j'ai une classe du style:
Code:
1 2 3 4
|
public class MaClasse{
public Collection<Truc> getTrucs(){}
} |
Apparemment, j'arrive à savoir que getTrucs renvoie une collection de Truc's en faisant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
class Truc {
}
class MaClasse {
private Collection<Truc> trucs;
public Collection<Truc> getTrucs() {
return trucs;
}
public static void main(String[] args) throws NoSuchMethodException {
Method getter = MaClasse.class.getMethod("getTrucs");
Type type = getter.getGenericReturnType();
if (type instanceof ParameterizedType) {
Type genericType = ((ParameterizedType) type).getActualTypeArguments()[0];
if (genericType instanceof Class) {
Class<?> contentClass = (Class<?>) genericType;
System.out.println(contentClass);
}
}
}
} |
Comment ça se fait? J'ai du rater un épisode.