2

我刚刚读完关于类型信息和反射的“Thinking in Java”一章。虽然instanceof对我来说似乎很自然,但一些反思的例子让我感到困惑。我想知道反射是否广泛用于Java项目?反思的“好的部分”是什么?你能推荐一些有趣的关于反射和类型信息的讲座,并提供更多好的和有价值的例子吗?

编辑(另一个问题):

为什么使用 访问私有方法和字段很有用java.lang.reflect.Method.setAccesible()

提前致谢。

4

4 回答 4

3

如果您可以发布一些示例,我很乐意为您解释。反射广泛用于需要提取有关运行对象的元信息的框架(例如,依赖于注释或对象中的字段的框架,想想 Hibernate、Spring 和许多其他)。在更高的层次上,我有时使用反射来提供通用功能(例如,对对象中的每个字符串进行编码,模拟 Duck Typing 等)。我知道你已经读过一本涵盖反射基础知识的书,但我需要指出 Sun (erm.. Oracle) 官方教程作为必读:http: //download.oracle.com/javase/tutorial/reflect/

于 2011-05-01T15:12:16.023 回答
2

我认为一个很好的例子是基于仅在运行时才知道的类名来实例化对象,例如包含在配置文件中。你仍然需要知道你动态实例化的类的通用接口,所以你也有一些东西可以转换它们。但这让配置驱动将使用哪个实现。

于 2011-05-01T15:10:11.987 回答
0

另一个示例可能是当您必须将对象强制转换为它是后代的类时。如果您不确定该对象的类型,您可以使用 instanceof 来确保转换在运行时是正确的,从而避免类转换异常。

一个例子:

public void actionPerformed (ActionEvent e){
    Object obj = e.getSource();

    if (obj instanceof objType)
    objType t = (objType) obj;   // you can check the type using instanceof if you are not sure about obj class at runtime
}
于 2011-05-01T15:21:08.207 回答
-1

在反射中提供此类功能的原因是由于工具/应用程序需要类、变量、方法的元信息的多种情况。例如:-

  1. IDE 使用自动完成功能来获取方法名称和属性名称。
  2. Tomcat web 容器通过解析 web.xml 文件和请求 URI 将请求转发到正确的模块。
  3. JUnit 使用反射来枚举一个类中的所有方法;假设 testXXX 命名的方法作为测试方法或 @Test 注释的方法。

要阅读有关反射的完整文章,您可以查看http://modernpathshala.com/Forum/Thread/Interview/308/give-some-examples-where-reflection-is-used

于 2016-01-05T18:17:56.807 回答