Vorrei creare un'istanza di una classe specificata utilizzando il suo nome. Il mio codice è mostrato sotto.Generics e Class.forName
Viene visualizzato un avviso del compilatore. Sto facendo questo nel modo giusto? È persino possibile usare il nome di una classe e ottenere un'istanza di quel tipo, poiché non penso che ci sia modo per il compilatore di sapere quale dovrebbe essere il tipo?
public static <T> T create(final String className) {
try {
final Class<?> clazz = Class.forName(className);
//WARNING: Type safety: Unchecked cast from capture#2-of ? to T
return (T) create(clazz);
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static <T> T create(final Class<T> classToCreate) {
final Constructor<T> constructor;
try {
constructor = classToCreate.getDeclaredConstructor();
final T result = constructor.newInstance();
return result;
}
catch (Exception e) {
e.printStackTrace();
}
}
Grazie
Sì, questo è il più vicino si può ottenere con Java. Per quanto riguarda la creazione dell'oggetto reale ci sono ancora alcuni trucchi da fare, ma non ho intenzione di entrare nello specifico dato che questi trucchi sono implementati nella mia classe di utilità che sto pianificando di rilasciare non appena ho scoperto il giusto canale per diffonderlo tra tutti i programmatori Java là fuori. – Esko
@Esko, considera il codice Google (per le versioni rilasciate) e/o Github (per il codice effettivo) –
È necessario aggiungere un cast per renderlo compilato 'classe finale clazz = (Classe ) Class.forName (className). asSubclass (ifaceClass); ' –