基于镜像的反射和传统反射之间的区别是什么



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

更新:我发现吉拉德·布拉查在《新闻峰》的《镜报》上拍摄了这段很棒(也有点古怪)的视频。http://www.hpi.uni-potsdam.de/hirschfeld/events/past/media/100105_Bracha_2010_LinguisticReflectionViaMirrors_HPI.mp4(镜像填充从7:42开始)

对于许多用途,我不认为镜像与Java反射有什么不同。关于镜像最重要的一点是,它们将反射API与标准对象API解耦,因此使用reflect(obj)而不是obj.getClass()。这似乎是一个很小的区别,但它给了你一些好东西:

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

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

Java:

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

Dart:

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

Javascript:

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

您最好的选择是Dart的联合设计师兼规范作者Gilad Bracha的这篇文章。要想一窥究竟,阅读第一章就足够了。

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

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

我还想向您介绍一下Gilad最近的另一个回答,他在回答中列出了其他一些很好的参考资料:如何通过镜像API获得静态方法的具体对象?

最新更新