反射 (计算机科学)

维基百科,自由的百科全书
跳转至: 导航搜索

计算机科学中,反射是指计算机程序运行时Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,那种程序能够“观察”并且修改自己的行为。要注意反射和内省type introspection)的区别。

历史背景[编辑]

最早的计算机在它们的原生汇编语言里编程,它本质上是反射,因为它是由定义编程指令作为数据。反射功能,如修改指令或分析它们是很平常的。编程迁移到更高层次的语言如C,这种实践消失了,直到带有反射特性的编程语言在它们的类型系统出现。

Brian Cantwell Smith在1982年的博士论文中介绍了编程语言的计算反射的这种概念,并且meta-circular解释器的概念用作3-Lisp的一个组成部分。

使用[编辑]

反射可以用于观察并修改程序在运行时的执行。一个reflection-oriented程序组件可以监测一个范围内的代码执行情况,可以根据期望的目标与此相关的范围修改本身。这通常是通过在运行时动态分配程序代码实现。

在面向对象的编程语言如Java中,反射允许在编译期间不知道接口的名称,字段、方法的情况下在运行时检查类、接口、字段和方法。它还允许的实例化新对象和调用的方法。

反射还可以用来动态地适应给定的程序在不同情况。例如,考虑一个应用程序,它使用两个不同的类X和Y互相交替执行类似的操作。没有 reflection-oriented编程,应用程序可能是硬编码的,以调用方法名称的类X和Y类。然而,使用reflection-oriented 编程范式中,应用程序可以在设计和编写利用反射在没有硬编码方法名称情况下调用类中的方法X和Y。Reflection-oriented编程几乎总是需 要更多的知识,框架,关系映射和对象关联,以利用更通用的代码执行。reflection-oriented编程的使用可以在某种程度上避免硬编码。

反射经常作为软件测试的一部分,比如运行时创建/实例化模拟对象。

反射也是元编程的一个关键策略。

实现[编辑]

支持反射的语言提供了一些在低级语言中难以实现的运行时特性。这些特性包括:

  • 作为一个第一类对象发现并修改源代码的结构(如代码块、类、方法、协议等)。
  • 将跟class或function匹配的字符串转换成class或function的调用或引用;
  • 在运行时像对待源代码语句一样计算字符串;
  • 创建一个新的语言字节码解释器来给编程结构一个新的意义或用途。

这些特性可以用不同的方法实现。

编译语言依赖于他们的运行时系统提供有关源代码的信息。一个objective-c编译的可执行文件,例如,记录所有方法的名字在一块可执行文件, 提供一个表来对应这些与底层的方法(或这些方法的选择器)编译进程序。在编译语言,支持运行时创建的功能,例如Common Lisp,运行时环境必须包括一个编译器或解释器。

反射可以为没有内置的反射工具的语言实现其通过使用一个程序转换系统来定义自动的源代码变更。

参见[编辑]

参考文献[编辑]

外部链接[编辑]