谁能从语言/环境不可知论的 Angular 解释这两种概念之间的区别?
另外,编程语言是否需要满足一组条件才能具有反射(reflection)性和/或内省(introspection)性?
如果存在,这些条件是什么?
最佳答案
The Wikipedia article有一个不错的总结:
拿一个静态类型的编译程序:
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)是指允许代码测试什么的东西(“我是什么?”),而反射(reflection)是指操纵程序结构本身的能力。例如,一个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)。如您所见,几乎没有明确的界线。但是,反射通常比自省(introspection)要强大。例如,在PHP中,您必须使用反射API来获取有关函数接受的参数类型的信息。那只是“被动”自省(introspection),但属于反射API。不过,这主要是实际实现的问题。简而言之,根据一般定义,为了进行内省(introspection),程序需要能够在运行时检查其自身的一部分,并根据此信息执行不同的代码。反射型程序可以在运行时更改其自己的代码执行规则,例如选择不调用构造函数,否则该构造函数是该语言定义的强制性操作。