反射 (计算机科学)

历史背景

最早的计算机在它们的原生汇编语言里编程，它本质上是反射，因为它是由定义编程指令作为数据。反射功能，如修改指令或分析它们是很平常的。编程迁移到更高层次的语言如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。
反射也是元编程的一个关键策略。