gpt4 book ai didi

reflection - 内省(introspection)和反射(reflection)有什么区别?

转载 作者:行者123 更新时间:2023-12-02 05:15:21 31 4
gpt4 key购买 nike

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

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

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

最佳答案

The Wikipedia article有一个相当不错的总结:

In computing, type introspection is the ability of a program to examine the type or properties of an object at runtime. Some programming languages possess this capability.

Introspection should not be confused with reflection, which goes a step further and is the ability for a program to manipulate the values, meta-data, properties and/or functions of an object at runtime. Some programming languages, e.g. Java, also possess that capability.

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

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

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

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

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

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

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

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

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

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

if ($obj instanceof Foo) ...

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

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

关于reflection - 内省(introspection)和反射(reflection)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25198271/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com