Un problema con il quale mi sono scontrato spesso è quello di rilevare i tipi parametrici usati in una dichiarazione generics a run-time. Senza spendere troppe parole, basti sapere che Java nel suo package reflect, prevede un super-tipo Type che corrisponde a tutti i tipi possibili Java, sia oggetti che primitivi. Una sottoclasse particolare di un tipo è un tipo parametrico, identificato da ParameterizedType. Tale tipo contiene la definizione di un tipo generico, con tanto di identificatore simbolico e classe usata per definire il tipo. Tuttavia la reflection normale di Java non è sufficiente per ottenere la definizione parametrica a run-time: occorre passare attraverso la definizione esplicita di Class con informazioni generiche. Ecco quindi che, da un qualunque tipo, è possibile risalire al primo parametro generics usato nella sua definizione con il seguente semplice metodo:
public final Class getModelTypeOfThisDAO() {
// get the superclass definition as a generic one
ParameterizedType genericSuperClass = (ParameterizedType) this.getClass().getGenericSuperclass();
// now get the first argument of the class
return (Class) genericSuperClass.getActualTypeArguments()[0];
}
// get the superclass definition as a generic one
ParameterizedType genericSuperClass = (ParameterizedType) this.getClass().getGenericSuperclass();
// now get the first argument of the class
return (Class) genericSuperClass.getActualTypeArguments()[0];
}
Nessun commento:
Posta un commento