【问题标题】:Programming with Core JAVA - Reflection API [duplicate]使用核心 JAVA 编程 - 反射 API [重复]
【发布时间】:2012-12-30 10:15:51
【问题描述】:

可能重复:
What is reflection, and why is it useful?

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

【问题讨论】:

标签: java reflection


【解决方案1】:

Reflection 是一个强大的构造,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;
}

这里,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();
    }
}

这里,ehcache 中的私有字段被更改和访问。这是彻头彻尾的糟糕编码。

【讨论】:

  • 等等,Field.setAccessible(true) 是在生产中使用的???我猜那是发现宝石的有趣的一天。
  • 是的,丹,确实……锁也使宝石更加光滑(“同步”发生了什么?)。当 ehcache 在系统的其他部分开始出现异常行为(忽略配置等)时,发现了该问题。在将其分解后......它保持不变,并带有注释作为警告。这是一个很好的教训。它说明了反射代码是多么危险。
【解决方案2】:

TechExchange 在解释反射方面做得很好。反射似乎是 Java 中的害群之马。我总是听到人们说这是它的错误和容易出错,但我发现它在正确完成时非常稳定和高效。我会说避免使用它并尝试使用内省库而不是编写本机反射代码。自省和反射一样,一般只是建立在底层反射库上的库。如果您使用的是 bean,那么 Spring 和 Apache-commons 都有很好的工具。

Spring 和 Apache 只针对 getter,不幸的是,我并不生活在 bean 世界中。我必须使用的一些对象是布尔“is”方法,并且确实发现自己正在编写反射代码。

无论如何,这里有一些简单的反射代码,它使用 0 个参数存储每个公共方法。

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);
        }
    }};
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 2012-04-06
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    相关资源
    最近更新 更多