一些语言,如Dart,使用基于镜像的反射,因此,简单地说,这种实现与你在C#或Java中看到的传统反射有什么不同。
更新:我发现了Gilad Bracha在Newspeak中基于镜像的反射上的这个优秀的(有点古怪的)视频。http://www.hpi.uni-potsdam.de/hirschfeld/events/past/media/100105_Bracha_2010_LinguisticReflectionViaMirrors_HPI.mp4 (镜像从7:42开始)
发布于 2012-08-28 01:01:48
对于许多用途,我不认为镜像与Java反射有什么不同。关于镜像,最重要的一点是它们将反射API与标准对象API解耦,因此使用reflect(obj)代替obj.getClass()。这似乎是一个很小的差异,但它会给你带来一些好处:
以下是镜像与Java和Javascript中的反射在获取对象方法时的不同之处:
Java:
myObject.getClass().getMethods(); // returns an arrayDart:
reflect(myObject).type.methods; // returns a mapJavascript:
var methods = [];
for (var m in myObject) {
if (typeof m === 'function') {
methods.push(m);
}
}发布于 2012-08-27 03:18:35
您最好的选择是this article by Gilad Bracha,他是Dart的联合设计者和规范作者。为了大致了解一下,阅读第一章可能就足够了。
抽象的说法是,镜像遵循传统反射不遵循的三个必要原则:
我们为面向对象编程语言中的反射和元编程工具确定了三个设计原则。Encapsulation:元级工具必须封装它们的实现。必须将Stratification:元级功能与基本级功能分开。本体对应:,元级工具的本体应该与它们所操作的语言的本体相对应。传统的/主流的反射架构并不遵循这些规则。相比之下,围绕镜像概念构建的反射式API的特点是坚持这三个原则。
发布于 2012-08-27 04:37:37
我还想指出吉拉德最近的另一个回答,他列出了其他一些很好的参考材料:How to get concrete object of a static method via mirror API?
https://stackoverflow.com/questions/12132264
复制相似问题