使用Core JAVA编程 - Reflection API

JAV*_*ner 6 java reflection

可能重复:
什么是反射,为什么它有用?

Java中反射的确切用法是什么?任何人都能举例说明吗?如果有任何相关概念,请分享.

Jac*_*erk 8

反射是一种强大的构造,通常由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中的私有字段被更改和访问.这是彻头彻尾的糟糕编码.