Reflection 基于镜像的反射与传统反射有什么区别?

Reflection 基于镜像的反射与传统反射有什么区别?,reflection,programming-languages,dart,language-design,dart-mirrors,Reflection,Programming Languages,Dart,Language Design,Dart Mirrors,像Dart这样的一些语言使用基于镜像的反射,因此,简单地说,这种实现与您在C#或Java中看到的传统反射有什么区别 更新: 我发现这段由吉拉德·布拉卡(Gilad Bracha)在《新话》(Newspeak)中拍摄的关于镜像反射的精彩视频(有些古怪)。 (mirror stuff 7:42开始)您最好的选择是Dart的联合设计师和规范作者。为了一瞥,读第一章可能就足够了 摘要声称镜子遵循三个传统反射所不遵循的必要原则: 我们确定了反射和元编程的三个设计原则 面向对象编程语言中的工具封装: 元级设

像Dart这样的一些语言使用基于镜像的反射,因此,简单地说,这种实现与您在C#或Java中看到的传统反射有什么区别

更新: 我发现这段由吉拉德·布拉卡(Gilad Bracha)在《新话》(Newspeak)中拍摄的关于镜像反射的精彩视频(有些古怪)。 (mirror stuff 7:42开始)

您最好的选择是Dart的联合设计师和规范作者。为了一瞥,读第一章可能就足够了

摘要声称镜子遵循三个传统反射所不遵循的必要原则:

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


我还想指出Gilad最近的另一个回答,他列出了一些其他伟大的参考资料:

对于许多用途,我认为镜像与Java反射没有什么不同。了解镜像最重要的一点是,镜像将反射API与标准对象API解耦,因此使用反射(obj)而不是obj.getClass()。这看起来差别不大,但它给了你一些好处:

  • 对象API没有被污染,并且没有通过重写反射方法破坏反射的危险
  • 您可能有不同的镜像系统。比如说,一个不允许访问私有方法的方法。这可能最终对工具非常有用
  • 不必包括后视镜系统。对于编译为JS,这可能很重要。如果不使用镜像,那么就没有带外访问代码的功能,剪枝变得可行
  • 镜像可以用于远程代码,而不仅仅是本地代码,因为您不需要反射的对象与镜像位于同一个隔离或VM中
  • 以下是镜像与Java和Javascript中的反射在获取对象方法时的不同之处:

    爪哇:

    省道:

    Javascript:

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

    谢谢你,约翰。我以前确实看到过这些链接。我希望能很快得到一个总结或要点,而不是阅读这篇论文。在我看来,许多差异都是在软件工程的层面上,对于我们这些在此基础上编写软件的人来说并不那么有趣。对我来说,使用镜像比使用.net反射API更容易。
    reflect(myObject).type.methods; // returns a map
    
    var methods = [];
    for (var m in myObject) {
      if (typeof m === 'function') {
        methods.push(m);
      }
    }