镜像反射和传统反射有什么区别?

num*_*ati 14 reflection programming-languages language-design dart dart-mirrors

像Dart这样的语言使用基于镜像的反射,所以简单来说,就像你在C#或Java中看到的那样,这种实现和传统反射之间有什么区别.

更新:我发现了Gilad Bracha关于Newspeak中基于Mirror的反射的这个优秀(有点古怪)的视频. http://www.hpi.uni-potsdam.de/hirschfeld/events/past/media/100105_Bracha_2010_LinguisticReflectionViaMirrors_HPI.mp4 (镜像东西从7:42开始)

Jus*_*ani 23

对于许多用途,我认为镜像与Java反射不同.了解镜像最重要的是它们将反射API与标准对象API分离,因此使用reflect(obj)代替obj.getClass().这是一个看似很小的差异,但它给你一些好的东西:

  1. 对象API没有被污染,并且没有通过覆盖反射方法来破坏反射的危险.
  2. 您可以拥有不同的镜像系统.比如,一个不允许访问私有方法的.这最终可能对工具非常有用.
  3. 不必包括镜子系统.为了编译JS,这很重要.如果没有使用镜像,则没有带外访问代码,修剪变得可行.
  4. 镜像可以用于远程代码,而不仅仅是本地代码,因为您不需要将反射对象与镜像位于同一个Isolate或VM中.

以下是用于获取对象方法时镜像与Java和Javascript中的反射不同的方式:

Java的:

myObject.getClass().getMethods(); // returns an array
Run Code Online (Sandbox Code Playgroud)

镖:

reflect(myObject).type.methods; // returns a map
Run Code Online (Sandbox Code Playgroud)

使用Javascript:

var methods = [];
for (var m in myObject) {
  if (typeof m === 'function') {
    methods.push(m);
  }
}
Run Code Online (Sandbox Code Playgroud)


Lad*_*cek 5

最好的选择是Dart的合作设计师和规范作者Gilad Bracha撰写的这篇文章.为了一瞥,阅读第一章可能就足够了.

镜像的抽象主张遵循传统反思没有遵循的三个必要原则:

我们为面向对象编程语言中的反射和元编程设施确定了三个设计原则. 封装: 元级设施必须封装其实现. 分层:元级别设施必须与基础级功能分开. 本体对应:元级别设施的本体论应该与他们操纵的语言的本体论相对应.传统/主流反光架构不遵循这些规则.相比之下,围绕镜子概念构建的反射API的特征在于遵守这三个原则.