内省和反思有什么区别



谁能从语言/环境不可知论的角度解释这两个概念之间的区别?

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

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

维基百科的文章有一个相当不错的总结:

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

内省不应与反射混淆,反射更进一步,是程序在运行时操作对象的值、元数据、属性和/或函数的能力。一些编程语言,例如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);
}

省和反思之间的界限究竟在哪里是值得商榷的。有人可能会说内省是允许代码测试某物是什么的东西("我是什么?"(,而反射是操纵程序结构本身的能力。例如,一个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。不过,这主要是实际实施的问题。

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

反射

是一种由两种技术组成的机制:

  1. 内省

    程序自我检查的能力

  2. 调解

    程序自我修改的能力(他的行为或状态(

参考 https://fr.wikipedia.org/wiki/R%C3%A9flexion_(信息(#Introspection_et_intercession

我的参考是一个法语页面,因为英文页面没有直接提到代祷这个词。

类型内省:

编程语言在运行时检查对象的类型或属性的能力。

示例(Java(:

String myObj1 = new String();
MyCustomObject myObj2 = new MyCustomObject();
if(myObj2 instanceof MyCustomObject) {
    System.out.println("This is an example of type interospection");
}


反射:

编程语言在运行时实现以下目标的能力。

  • 类型内省(如上所示(
  • 检查和修改对象。
  • 等等

相关内容

  • 没有找到相关文章

最新更新