反射是一种强大的构造,通常由Guice和Hibernate等底层库使用,以使生活更轻松.它通常用于需要配置类然后实时实例化的地方.例如:
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;
}
Run Code Online (Sandbox Code Playgroud)
这里,clazz参数命名要实例化的类.假设该类将是Strategy类/接口的子类.然后,它还通过config参数传入的设置启动.这允许高度可配置/动态的环境.
但是,反射通常会导致非常危险(和恶意)的代码,因此,除非绝对必要,否则应避免反射.还要记住,反射比直接调用慢.这是一个从生产系统中拉出如何不使用反射的实际例子.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,ehcache中的私有字段被更改和访问.这是彻头彻尾的糟糕编码.