2012-05-24 19 views

risposta

20

Generics sono cancellati al momento della compilazione, forniscono solo informazioni supplementari al compilatore per determinare gli errori. In realtà non cambiano la firma del metodo nel file .class.

Ciò significa che si chiama un metodo generico mediante riflessione in Java esattamente nello stesso modo in cui si chiamerebbe un metodo non generico in Java, tranne che invece di specificare un tipo di T, si specificherà un tipo di Object.

Ci sono così tanti tutorial su come chiamare un metodo normale mediante la riflessione che esito ad aggiungere ancora un altro; tuttavia, se hai davvero bisogno di indicazioni su come chiamare un metodo per riflessione, aggiungi un commento qui sotto e aggiungo il codice necessario.

Se le cose non funzionano come previsto, è sempre possibile eseguire javap sul file di classe compilato per verificare che si stiano utilizzando gli oggetti giusti nell'elenco degli argomenti. Potrebbe essere possibile che se si specifica una firma generica di tipo <T extends List>, l'oggetto parametro risultante potrebbe effettivamente essere un oggetto List.

10

Questo funziona per me.

Method method = Person.class.getMethod("print", Object.class); 

method.invoke(new Person(), "this is a string"); 
method.invoke(new Person(), 273); 
method.invoke(new Person(), new Object()); 

la stampa

this is a string 
273 
[email protected] 

Naturalmente la teoria alla base di questo è spiegato in modo bello @Edwin's answer.

4

Per evidenziare il punto indicato nella risposta di Edwin, dove stiamo usando estende in un tipo generico: se si dispone di una classe come

GenericHibernateDao<T extends Serializable> 

, e un metodo

public T save(T entity) {}; 

per invocare il metodo di salvataggio utilizzando la riflessione è necessario utilizzare la classe Serializable, vale a dire, è necessario utilizzare:

Method method = GenericHibernateDao.class.getMethod(methodName, Serializable.class); 

e n ot il Object.class come il parametro, dal momento che stiamo usando

<T extends Serializable> 
Problemi correlati