内省和反思有什么区别?

2024-01-06

任何人都可以从语言/环境不可知论的角度解释这两个概念之间的区别吗?

编程语言是否需要满足一组条件才能进行反思和/或内省?

如果有的话,这些条件是什么?


维基百科文章 http://en.wikipedia.org/wiki/Type_introspection有一个相当不错的总结:

在计算中,类型自省是程序在运行时检查对象的类型或属性的能力。一些编程语言具有这种能力。

内省不应与反射混淆,后者更进一步,是程序在运行时操作对象的值、元数据、属性和/或函数的能力。一些编程语言,例如Java也具备这种能力。

采用静态类型的编译程序:

SomeType function foo(int i) {
    return new SomeType(i);
}

所有类型都是已知的并在编译时强制执行,如果程序不满足其自己的显式类型约束,则甚至不应该编译。动态编程语言通常不会表现出这种严格性,变量的类型在编译时不一定是已知的。它们可能看起来更像这样:

function foo(i) {
    return new SomeType(i);
}

该函数不能保证什么i没错,只是穿越而已。这可能会或可能不会在某个地方引起问题,类型系统在这里无能为力。这种错误检查通常被归咎于用户态代码,因此此类代码需要自省功能:

function foo(i) {
    if (!is_int(i)) {
        throw new InvalidArgumentException;
    }
    return new SomeType(i);
}

内省和反思之间到底在哪里划清界线有些争议。人们可能会说内省是任何允许代码test某物是什么(“我是什么?”),而反射是操纵程序结构本身的能力。例如,一个 PHP 示例:

$ref = new ReflectionClass('Foo');
$foo = $ref->newInstanceWithoutConstructor();

上面的代码绕过了类的构造函数的运行Foo创建它的新实例时。这就是运行时的代码操作。但实际上,PHP 中的反射 API 还包含自省功能。其中一些功能与“较低”内省功能的功能重复。例如。:

$ref = new ReflectionClass($obj);
if ($ref->getName() == 'Foo') ...

if ($obj instanceof Foo) ...

两个片段本质上都做同样的事情,但一个使用反射,另一个使用所谓的内省。正如您所看到的,几乎没有明确的分界线。然而,反思通常比内省更有力量。例如,在 PHP 中,您必须使用反射 API 来获取有关函数接受的参数类型的信息。这只是“被动”内省,但属于反射 API。但这主要是一个实际实施的问题。

简而言之,根据一般定义,要进行内省,程序需要能够在运行时检查自身的各个部分,并根据此信息执行不同的代码。除此之外,反射程序可以在运行时更改其自己的代码执行规则,例如选择不调用构造函数,否则这是语言定义的强制操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内省和反思有什么区别? 的相关文章

随机推荐

  • 在 Google Cloud 中将 http 重定向到 https

    我已经设置了一个负载均衡器 它接受来自用户的 https 连接 然后 计算引擎使用 http 连接连接到负载均衡器 我在根文件夹中编写了以下 htaccess 文件 RewriteEngine On RewriteCond HTTPS of
  • 如何计算图表的趋势线?

    谷歌不是我的朋友 自从我在大学上统计课以来已经很长时间了 我需要计算图表上趋势线的起点和终点 有没有一种简单的方法可以做到这一点 使用 C 工作 但任何适合你的语言 感谢大家的帮助 我已经离开这个问题几天了 刚刚回来 能够将其拼凑在一起 不
  • 在Python中,一行中的多个“with”语句是否相当于嵌套的“with”语句?

    这两个陈述等价吗 with A as a B as b do something with A as a with B as b do something 我问是因为两者a and b改变全局变量 这里是张量流 和b取决于所做的更改a 所以
  • 使用 Git diff 检测代码移动 + 如何使用 diff 选项

    考虑文件 1 c 包含三个函数以及作者 M 和 J 所做的更改 如果有人运行git blame 1 c 他将得到以下输出 869c699 M 2012 09 25 14 05 31 0600 1 de24af82 J 2012 09 25
  • MVC @Html.DropDownList 在 ViewBag 中使用 SelectList 时出现错误

    我有一个在控制器中创建的列表 var PayList new new ListEntry Id 1 Name new ListEntry Id 2 Name Yes new ListEntry Id 3 Name No ViewBag Pa
  • 如何使用事件处理程序检测实时 DigiScan 图像何时完成获取完整帧?

    我正在寻找实时 DigiScan 图像的快照 但是 我只想在获取完整 或接近完整 的帧时才这样做 将事件处理程序附加到实时 DigiScan 图像不起作用 因为图像会随着连续采集的每一行而 变化 我希望仅监视实时图像的最后几个像素 并仅在这
  • Wordpress 有条件 if is_single

    我尝试在我的 single php 页面上使用条件语句 我想要做的是 如果它是自定义帖子类型 current products 则使用特定的 single product php 模板页面 如果不是 即标准博客文章 则使用默认的 singl
  • 使用 LINQ to MySQL (DbLinq) 和动态 LINQ 的可排序 JqGrid - Orderby 不起作用

    我在 JqGrid 中排序条目时遇到问题 Orderby 似乎不起作用 我在代码中设置了断点 我注意到 orderby 不会改变元素的顺序 知道可能出什么问题吗 我正在使用 LINQ to SQL 和 MySQL DbLinq 项目 我的操
  • 如何使用 BERT 进行机器翻译?

    我遇到了一个大问题 对于我的学士论文 我必须使用 BERT 制作一个机器翻译模型 但我现在一事无成 您知道可以在这里帮助我的文档或其他东西吗 我已经阅读了一些这方面的论文 但也许有文档或教程可以帮助我 对于我的学士论文 我必须将文本摘要翻译
  • 如何让 JavaScript 延迟,然后刷新页面

    我希望我的 JavaScript 在我创建的函数结束时等待七秒钟 然后刷新我的页面 如果它很重要 我在下面列出了 JavaScript 和 HTML 的重要部分 JavaScript var textfill function var no
  • 录音在java中不工作

    我正在尝试通过java录制声音 该声音正在我的Windows机器上通过扬声器 耳机播放 我遇到的问题是我没有找到 AudioSystem 支持的单个 TargetDataLine 我尝试了 getSupportedFormats 方法来检查
  • 编程范式、设计模式和应用程序架构之间的区别?

    我没有编程背景 经常遇到编程范式 设计模式和应用程序架构等术语 虽然我认为我对这些术语的含义有一个模糊的理解 但如果有人能够澄清每个术语是什么 它们与其他术语有何不同以及这些概念如何应用于 Objective C 我将不胜感激 编程范式 类
  • 如何显示输入类型=“datetime-local”的值?

    我的代码是这样的 div test div div div
  • 如何确定 QAction 的来源?

    我想知道是否有任何简单 优雅的方法来确定 QAction 的来源 我的意思是我有一个 QAction 它被添加到多个 QWidget 带有QWidget addAction http doc qt nokia com latest qwid
  • 以编程方式清除cloudflare缓存

    在将请求发送到 node js api 后 我尝试以编程方式清除单个 url 的 cloudflare 缓存 我正在使用https github com cloudflare node cloudflare https github com
  • 尝试计算手机解锁的次数

    几个月前我对此感到厌倦 但失败了 我想做的是计算用户解锁手机的次数并将其显示在屏幕上 但每次解锁手机时我都会得到模糊的数字 我的代码如下 我的主要活动 oncreate Override protected void onCreate Bu
  • 将文本插入传入电子邮件 Outlook 2013 锁定只读

    我正在努力通过 VBA 在传入电子邮件中插入字符串 该例程在发送邮件时工作正常 并且如果用户单击 操作编辑 它将对传入邮件起作用 问题是传入邮件被锁定为只读模式 在过去的 13 5 个小时里我到处寻找 在早期版本的 Outlook 中这是可
  • 如何在具有多个峰值的数据集中找到 FWHM?

    我正在使用一个 Python 脚本 它可以在特定的值范围内沿着一维轮廓查找峰值 或在我的例子中为谷值 的索引 我的目标是测量每个感兴趣的山谷的半高宽 这是一维轮廓的示例 https i stack imgur com UTj33 png 这
  • 当应用程序在后台时,android O 中的 onMessageReceived 不会被调用

    我正在从我的服务器发送数据有效负载通知 这是示例 url https fcm googleapis com fcm send to userToken data some json here 通过这种方式 即使应用程序没有运行 我也可以在所
  • 内省和反思有什么区别?

    任何人都可以从语言 环境不可知论的角度解释这两个概念之间的区别吗 编程语言是否需要满足一组条件才能进行反思和 或内省 如果有的话 这些条件是什么 维基百科文章 http en wikipedia org wiki Type introspe