本页使用了标题或全文手工转换

反射 (计算机科学)

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

计算机科学中,反射是指计算机程序运行时Run time)可以访问、检测和修改它本身状态或行为的一种能力。[1]用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。

要注意术语“反射”和“内省”(type introspection)的关系。内省(或称“自省”)机制仅指程序在运行时对自身信息(称为元数据)的检测;反射机制不仅包括要能在运行时对程序自身信息进行检测,还要求程序能进一步根据这些信息改变程序状态或结构。[1]

历史背景[编辑]

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

布莱恩·史密斯(Brian Cantwell Smith)在1982年的博士论文《编程语言中的步骤式反射》("Procedural Reflection in Programming Languages")中介绍了“编程语言的计算反射”概念,并且引入meta-circular解释器的概念用作3-Lisp的一个组成部分。

概况[编辑]

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

面向对象编程语言Java中,反射允许在编译期间不知道接口的名称,字段(fields,即变量)、方法的情况下在运行时检查类、接口、字段和方法。它还允许根据判断结果进行实例化新对象和不同方法的调用。

反射还可以使给定的程序动态地适应不同的运行情况。例如,考虑一个应用程序,它使用2个不同的类X和Y互相交替执行类似的操作。没有使用面向反射编程技术,应用程序可能是硬编码的(即把代码写死,缺乏灵活性),以调用方法名称的类X和Y类。然而,使用面向反射的编程范式中,应用程序可以在设计和编写利用反射在没有硬编码方法名称情况下调用类中的方法X和Y。

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

示例[编辑]

特点[编辑]

优点[编辑]

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

  • 可以在一定程度上避免硬编码,提供灵活性和通用性。[2]
  • 可以作为一个第一類物件发现并修改源代码的结构(如代码块、类、方法、协议等)。
  • 可以在运行时像对待源代码语句一样计算符号语法的字符串(类似JavaScript的eval()函数),进而可将跟class或function匹配的字符串转换成class或function的调用或引用。
  • 可以创建一个新的语言字节码解释器来给编程结构一个新的意义或用途。

劣势[编辑]

  • 此技术的学习成本高。面向反射的编程需要较多的高级知识,包括框架、关系映射和对象交互,以利用更通用的代码执行。
  • 同样因为反射的概念和语法都比较抽象,过多地滥用反射技术会使得代码难以被其他人读懂,不利于合作与交流。[2]
  • 由于将部分信息检查工作从编译期推迟到了运行期,此举在提高了代码灵活性的同时,牺牲了一点点运行效率。[2]

通过深入学习反射的特性和技巧,它的劣势可以尽量避免,但这需要许多时间和经验的积累。[2]

常见应用[编辑]

  • 反射经常作为软件测试的一部分,比如运行时创建/实例化模拟对象。
  • Java语言解析XML文件的技术用到了反射。

参见[编辑]

参考资料[编辑]

引用[编辑]

  1. ^ 1.0 1.1 Forman 2005,第8页。
  2. ^ 2.0 2.1 2.2 2.3 Forman 2005,第4页。

来源[编辑]

  • Ira R. Forman, Nate Forman. Java Reflection in Action [Java反射实战] 1. Manning Publications Co. 2005年. ISBN 1-932394-18-4 (英语). 

外部链接[编辑]