像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开始)
答案 0 :(得分:23)
对于许多用途,我认为镜像与Java反射不同。了解镜像最重要的是它们将反射API与标准对象API分离,因此使用reflect(obj)代替obj.getClass()。这是一个看似微小的差异,但它给了你一些不错的东西:
当用于获取对象的方法时,镜像与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?