Reflection è un potente costrutto che viene spesso utilizzato dalle librerie sottostanti come Guice e Hibernate per semplificare la vita. Viene spesso utilizzato dove una classe deve essere configurata e quindi istanziata al volo. Ad esempio:
public Strategy prepare(String clazz, Properties config) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> clazz = Class.forName(clazz);
Strategy strategy = (Strategy) clazz.newInstance();
strategy.initialise(config);
return strategy;
}
Qui, il parametro clazz indica la classe da istanziare. Si presume che la classe sarà una sottoclasse della classe/interfaccia della strategia. Viene quindi avviato anche con le impostazioni passate attraverso il parametro config. Ciò consente un ambiente altamente configurabile/dinamico.
Tuttavia, la riflessione porta spesso a codice molto pericoloso (e malevolo) e per tale motivo, la riflessione dovrebbe essere evitata, a meno che non sia assolutamente necessario. Inoltre, tieni presente che la riflessione è più lenta di una chiamata diretta. Ecco un esempio reale tratto da un sistema di produzione su come NON usare la riflessione.
private static CacheManager getRawInstance() {
lock.lock();
try {
final Field field = CacheManager.class.getDeclaredField("singleton");
field.setAccessible(true); // << -- ??
return (CacheManager) field.get(CacheManager.class);
} catch (Exception e) {
logger.error(e.getMessage(), e);
return null;
} finally {
lock.unlock();
}
}
Qui, il campo privato in ehcache viene modificato e vi si accede. Questa è decisamente una cattiva programmazione.
fonte
2013-01-16 07:01:08
O http://stackoverflow.com/questions/9222621/java-what-scenarios-call-for-the-use-of-reflection –