关于使用Core JAVA编程:使用Core JAVA编程 – Reflection API

Programming with Core JAVA - Reflection API

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is reflection, and why is it useful?

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


反射是一种强大的构造,通常由基础库(如guice和hibernate)使用,以简化生活。它通常用于需要配置类,然后动态实例化的地方。例如:

1
2
3
4
5
6
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;
}

在这里,clazz参数命名要实例化的类。假设类是策略类/接口的子类。然后通过配置参数传入设置来启动。这允许一个高度可配置/动态的环境。

但是,反射通常会导致非常危险(和恶意)的代码,因此,除非绝对必要,否则应避免反射。还要记住,反射比直接调用慢。下面是一个从生产系统中提取的关于如何不使用反射的实际示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
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();
    }
}

在这里,ehcache中的私有字段被更改和访问。这是完全错误的编码。


TechExchange很好地解释了反射。反射在爪哇看来是一只害群之马。我经常听到有人说这是一种错误,容易犯错误,但我发现它是相当稳定和有效的,当它做对了。我会说,避免使用它,并尝试一个自省库,而不是编写本机反射代码。内省与反射相同,通常只是一个建立在底层反射库上的库。如果您使用bean,那么Spring和ApacheCommons都有很好的工具。

斯普林和阿帕奇只瞄准吸食者,不幸的是,我并不生活在一个豆的世界里。我必须处理的一些对象是布尔型的"is"方法,并且发现自己正在编写反射代码。

总之,这里有一些简单的反射代码,它用0个参数存储每个公共方法。

1
2
3
4
5
6
7
8
9
10
11
public void foo(final Class _class){
    List<Method> methods = new ArrayList<Method>(){{
        for( Method method : _class.getMethods() ) {

            if( Modifier.isPublic( method.getModifiers() )
                && method.getGenericParameterTypes().length == 0 ){

            add(method);
        }
    }};
}