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

时间:2012-08-26 17:20:30

标签: reflection programming-languages dart language-design 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开始)

3 个答案:

答案 0 :(得分:23)

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

  1. 对象API没有受到污染,并且没有通过覆盖反射方法来破坏反射的危险。
  2. 您可能拥有不同的镜像系统。比如,一个不允许访问私有方法的。这最终可能对工具非常有用。
  3. 不必包含镜像系统。为了编译JS,这很重要。如果没有使用镜像,则没有带外访问代码,修剪变得可行。
  4. 镜像可以用于远程代码,而不仅仅是本地代码,因为您不需要反射对象与镜像位于同一个隔离区或虚拟机中。
  5. 当用于获取对象的方法时,镜像与Java和Javascript中的反射不同:

    爪哇:

    myObject.getClass().getMethods(); // returns an array
    

    落镖:

    reflect(myObject).type.methods; // returns a map
    

    使用Javascript:

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

答案 1 :(得分:5)

你最好的选择是this article by Gilad Bracha,Dart的合作设计师和规范作者。为了一瞥,阅读第一章可能就足够了。

摘要声称镜像遵循传统反思没有遵循的三个必要原则:

  

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

答案 2 :(得分:1)

我还要指出Gilad最近的另一个答案,他列出了其他一些很好的参考资料:How to get concrete object of a static method via mirror API?