反射 (计算机科学)

✍ dations ◷ 2025-09-07 06:54:15 #编程典范

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

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

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

在类型检测严格的面向对象的编程语言如Java中,一般需要在编译期间对程序中需要调用的对象的具体类型、接口、字段和方法的合法性进行检查。反射技术则允许将对需要调用的对象的信息检查工作从编译期间推迟到运行期间再现场执行。这样一来,可以在编译期间先不明确目标对象的接口名称、字段(fields,即对象的成员变量)、可用方法,然后在运行根据目标对象自身的信息决定如何处理。它还允许根据判断结果进行实例化新对象和相关方法的调用。

反射主要用途就是使给定的程序动态地适应不同的运行情况。利用面向对象建模中的多态性也可以简化编写分别适用于多种不同情形的功能代码,但是反射可以解决多态性并不适用的更普遍情形,从而更大程度地避免硬编码(即把代码的细节“写死”,缺乏灵活性)的代码风格。

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

考虑一个面向对象风格的应用程序,它可以分别使用功能类X、功能类Y、功能类Z来执行相似的操作。如果事先创建并传递给它的工具是类A的实例,它就调用类A实例具有的方法完成功能;如果事先创建的是类B的实例,它就调用类B实例具有的方法完成功能,如果事先创建的是类C的实例,它就调用类C实例完成功能。如果它们完成相似功能的方法名称都相同,或方法都继承自同一个父类并实现了多态性,那么只需调用名称唯一的目标方法即可,问题已经解决;如果这些条件并不满足,我们碰到的问题变成要根据情况从不同对象中调用名称上存在区别、功能却相似的方法,此时只能分别判断3种不同情况然后挨个进行硬编码,或者考虑使用更优雅的反射技巧。分别判断并硬编码的做法是:在主程序中对不同的功能类进行差异化对待,在运行主程序的时候判断当前可用的工具是不是类A的实例,如果是就以明确“指名道姓”的方式调用它的特定方法,如果不是就继续判断可用的工具是不是类B的实例,如果是就调用B的特定方法,如果也不是就将其视为类C的实例并调用对应的方法。如果可能的类型更多的话,就需要写更多的条件分支语句。然而,如果使用反射式的编程技术,应用程序可以在只写出主要流程、但不写死具体方法名称的情况下,在运行时期灵活地获取可用的目标对象信息,根据目标方法的大致特征自动识别和调用需要的方法,并自动调用目标对象的对应方法解决问题。

早期计算机的原生汇编语言本质上就具有反射特性。因为它是由定义编程指令作为数据,如动态修改指令或对它们进行分析等等的反射功能是很平常的。编程发展到如C语言等高抽象层次的语言时,这种实践消失了,带有反射特性的高级编程语言要到更晚的时候才出现。

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

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

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

相关

  • 蒙索罗1法国统计部门在计算土地面积时,不计算面积大于1平方公里的湖泊、池塘、冰川和河口。蒙索罗(法语:Montsoreau ; 法语发音:.mw-parser-output .IPA{font-family:"Charis SIL","D
  • 肺血管阻塞肺栓塞(英语:Pulmonary embolism,简称 PE),系描述肺动脉遭到来自其他地方的物质,经过血液循环而阻塞肺动脉的病况。肺栓塞的症状有呼吸困难、吸气时胸痛,以及咳血等等,也可能会出现
  • 恐马恐马属(学名:Dinohippus;来自希腊语,原意即“可怕的马”)是一属已经灭绝的草食性马科生物。它们生活在中新世亥姆菲尔阶(英语:Hemphillian)到上新世赞克尔阶(英语:Zanclean)之间的北美
  • 李国庆李国庆(1964年10月1日-),中国企业家。他曾任当当网联合总裁、中国书刊发行行业协会副会长、科文实业集团董事长等职。他1995年创立科文实业集团,于1999年和美国国际数据集团(IDG)、
  • 南开学校大学部天津市南开中学,曾名私立敬业中学堂、南开私立第一中学堂、私立南开中学堂、天津市第十五中学等,是天津市教育委员会直属重点中学、国家级示范性高中,位于天津市南开区南开四马
  • 罗伯茨法院小约翰·格洛弗·罗伯茨(John Glover Roberts, Jr.,1955年1月27日-)是美国律师、法学家、及法官。他目前是第17任美国首席大法官。加入最高法院前,他是美国哥伦比亚特区巡回上诉
  • 白足鼠属白足鼠属(),哺乳纲、啮齿目、仓鼠科的一属,而与白足鼠属(球鹿鼠)同科的动物尚有里约稻鼠属(里约稻鼠)、叶耳鼠属(沙叶耳鼠)、洞鼠属(粗毛洞鼠)、大耳攀鼠属(大耳攀鼠)等之数种哺乳动物。
  • 罗恩·怀登罗纳德·李·“罗恩”·怀登(英语:Ronald Lee "Ron" Wyden;1949年5月3日-),是一位美国民主党政治人物,自1996年成为俄勒冈州联邦参议院议员。此前他曾是美国众议院1981年至1996年期
  • 2006年孟买火车连环爆炸案2006年孟买火车连环爆炸案是于7月11日发生在印度最大城市及经济中心,马哈拉施特拉邦首府孟买的区域铁路,七个连环的炸弹爆炸的事件。首个炸弹于当地时间18:24(12:54 UTC)爆炸,直
  • 安德烈亚斯·利巴菲乌斯安德烈亚斯·利巴菲乌斯(德语:Andreas Libavius,1555年-1616年7月25日)生于哈雷,德国医生、化学家、炼金术士。利巴菲乌斯曾在伊尔默瑙和科堡担任教师,1588年在耶拿晋升为教授。159