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 |