如果您头脑中想象的是一个复杂的、面向对象类型的系统,但在代码中却表现为简单的、C 语言风格的函数,而且没有正式的数据结构,那么显然您的程序不可能动态地推断出,某变量 v1 的指针指向某种类型 T 的对象实例。因为毕竟类型 T 是您头脑中的概念,它从未在您的编程语句中明确地出现。但如果您使用一种更为灵活的面向对象语言(如 C#)来表达程序的抽象结构,并直接引入类型 T 的概念,那么编译器就会把您的想法转换成某种日后可以通过合适的逻辑来理解的形式,就象公共语言运行时 (CLR) 或某种动态语言解释器所提供的一样。
反射完全是动态、运行时的技术吗?简单的说,不是这样。整个开发和执行周期中,很多时候反射对开发人员都可用且有用。一些编程语言通过独立编译器实现,这些编译器将高级代码直接转换成机器能够识别的指令。输出文件只包括编译过的输入,并且运行时没有用于接受不透明对象并动态分析其定义的支持逻辑。这正是许多传统 C 编译器的情形。因为在目标可执行文件中几乎没有支持逻辑,因此您无法完成太多动态反射,然而编译器会不时提供静态反射 — 例如,普遍运用的 typeof 运算符允许程序员在编译时检查类型标识。