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

更新: 我发现吉拉德·布拉查(Gilad Bracha)在NewSpeech中基于镜像的反射(Mirror Based Reflation)上的这段出色的(有点古怪的)视频. 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没有受到污染,并且不存在通过覆盖反射方法而 destruct 反射的危险.
  2. 您可能有不同的镜像系统.比如说,一个不允许访问私有方法的方法.这最终可能对工具非常有用.
  3. 镜子系统不一定要包括在内.对于编译到JS而言,这一点可能很重要.如果不使用镜像,那么就没有带外访问代码,因此修剪就变得可行了.
  4. 镜像可以用于远程代码,而不仅仅是本地代码,因为您不需要反射的对象与镜像位于同一个隔离或虚拟机中.

以下是镜像与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相关问答推荐

为什么我们在dart 里有工具?

观察对象的状态

在 Flutter 中以间隔自动获取 API 数据

dart nullsafey 和使用旧包

Flutter-创建value和name数组

使用brave浏览器调试flutter web app

Flutter 从asset文件夹中读取所有文件

表单的 TextFormField 中的多个光标(cursor)

如何在Flutter中返回异步函数的值?

如何更改Flatter DevTools的默认浏览器?

如何在 Dart 2 中将 List 更改为 List

pub 依赖和 dev_dependencies 有什么区别?

用于 dartlang 的 REPL

从 Dart 应用访问 pubspec.yaml 属性

Dart 如何匹配然后替换正则表达式

使用 VSCode 创建和运行 Dart 控制台应用程序?

如何在 Dart 中引用另一个文件?

如何在 Dart 中将日期/时间字符串转换为 DateTime 对象?

在 Dart 中克​​隆list列表、map或set集合

你需要在 Dart 中使用new关键字吗?