"Reflection在现实世界应用中的作用"
Reflection是一种语言在运行时能够检查和动态调用类、方法、属性等的能力。
例如,在Java中,所有对象都有方法getClass()
,让您在编译时不知道对象类的情况下确定其类(例如,如果将其声明为Object
)-这似乎微不足道,但在不太动态的语言例如C ++
中,这种反射是不可能的。更高级的用法可以列出和调用方法、构造函数等。
反射很重要,因为它让您编写的程序不必在编译时“知道”所有内容,使它们更加动态,因为它们可以在运行时连接在一起。代码可以针对已知接口编写,但实际使用的类可以通过从配置文件中反射实例化。
许多现代框架出于这个原因而广泛使用反射。大多数其他现代语言也使用反射,在脚本语言(例如Python)中它们甚至更加紧密地集成,因为它在这些语言的一般编程模型中感觉更自然。
"反射"是用来描述能够检查同一系统(或者自身)中其他代码的代码。
例如,假设你在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++。
无法翻译没有给出翻译内容的
标记中的内容。