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

The article Ottenere informazioni su generics a run-time has been posted by Luca Ferrari on October 7, 2010

Tags: java