什么是反射,它为什么有用?

新手上路,请多包涵

什么是反射,它为什么有用?

我对 Java 特别感兴趣,但我认为原则在任何语言中都是相同的。

原文由 Lehane 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 549
2 个回答

名称反射用于描述能够检查同一系统(或自身)中的其他代码的代码。

例如,假设您在 Java 中有一个未知类型的对象,如果存在,您想对其调用“doSomething”方法。除非对象符合已知接口,否则 Java 的静态类型系统并非真正设计为支持这一点,但是使用反射,您的代码可以查看对象并找出它是否有一个名为“doSomething”的方法,然后调用它,如果你想要。

所以,给你一个 Java 中的代码示例(想象有问题的对象是 foo):

 Method method = foo.getClass().getMethod("doSomething", null);
method.invoke(foo, null);

Java 中一个非常常见的用例是使用注释。例如,JUnit 4 将使用反射在您的类中查看带有 @Test 注释标记的方法,然后在运行单元测试时调用它们。

有一些很好的反射示例可以帮助您入门 http://docs.oracle.com/javase/tutorial/reflect/index.html

最后,是的,这些概念在其他支持反射的静态类型语言(如 C#)中非常相似。在动态类型语言中,上面描述的用例不太必要(因为编译器将允许在任何对象上调用任何方法,如果它不存在则在运行时失败),但第二种情况是寻找标记或以某种方式工作仍然很普遍。

从评论更新:

检查系统中的代码并查看对象类型的能力不是反射,而是类型自省。然后,反射是通过使用自省在运行时进行修改的能力。这里有必要进行区分,因为某些语言支持自省,但不支持反射。一个这样的例子是 C++

原文由 Matt Sheppard 发布,翻译遵循 CC BY-SA 4.0 许可协议

反射 是一种语言在运行时检查和动态调用类、方法、属性等的能力。

例如,Java 中的所有对象都有方法 getClass() ,它可以让你确定对象的类,即使你在编译时不知道它(例如,如果你将它声明为 Object ) - 这可能看起来微不足道,但这种反射在不太动态的语言中是不可能的,例如 C++ 。更高级的用途让您可以列出和调用方法、构造函数等。

反射很重要,因为它让您编写的程序不必在编译时“知道”所有内容,从而使它们更具动态性,因为它们可以在运行时捆绑在一起。可以针对已知接口编写代码,但可以使用来自配置文件的反射来实例化要使用的实际类。

出于这个原因,许多现代框架广泛使用反射。大多数其他现代语言也使用反射,并且在脚本语言(如 Python)中,它们集成得更紧密,因为在这些语言的通用编程模型中感觉更自然。

原文由 Liedman 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题