首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于镜像的反射和传统的反射有什么不同?

基于镜像的反射和传统的反射有什么不同?
EN

Stack Overflow用户
提问于 2012-08-27 01:20:30
回答 3查看 2.9K关注 0票数 14

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-28 01:01:48

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

  1. 对象应用程序接口没有被污染,也没有因为重写反射方法而破坏反射的危险。
  2. 你可能会有不同的镜像系统。比如说,一个不允许访问私有方法的方法。这可能最终会对工具非常有用。
  3. 镜像系统不是必须包括在内的。对于编译到JS,这一点可能很重要。如果不使用镜像,则不会有带外访问代码,并且修剪成为viable.
  4. Mirrors可以在远程代码上工作,而不仅仅是本地代码,因为您不需要反射对象与镜像在相同的隔离或VM中。

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

Java:

代码语言:javascript
复制
myObject.getClass().getMethods(); // returns an array

Dart:

代码语言:javascript
复制
reflect(myObject).type.methods; // returns a map

Javascript:

代码语言:javascript
复制
var methods = [];
for (var m in myObject) {
  if (typeof m === 'function') {
    methods.push(m);
  }
}
票数 23
EN

Stack Overflow用户

发布于 2012-08-27 03:18:35

您最好的选择是this article by Gilad Bracha,他是Dart的联合设计者和规范作者。为了大致了解一下,阅读第一章可能就足够了。

抽象的说法是,镜像遵循传统反射不遵循的三个必要原则:

我们为面向对象编程语言中的反射和元编程工具确定了三个设计原则。Encapsulation:元级工具必须封装它们的实现。必须将Stratification:元级功能与基本级功能分开。本体对应:,元级工具的本体应该与它们所操作的语言的本体相对应。传统的/主流的反射架构并不遵循这些规则。相比之下,围绕镜像概念构建的反射式API的特点是坚持这三个原则。

票数 5
EN

Stack Overflow用户

发布于 2012-08-27 04:37:37

我还想指出吉拉德最近的另一个回答,他列出了其他一些很好的参考材料:How to get concrete object of a static method via mirror API?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12132264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档