对于许多用途,我不认为镜像与Java反射有什么不同.关于镜像,最重要的一点是它们将反射API与标准对象API解耦,因此您可以使用Reflect(Obj)代替obj.getClass().这看似很小的差别,但它会给你带来一些美好的东西:
- 对象API没有受到污染,并且不存在通过覆盖反射方法而 destruct 反射的危险.
- 您可能有不同的镜像系统.比如说,一个不允许访问私有方法的方法.这最终可能对工具非常有用.
- 镜子系统不一定要包括在内.对于编译到JS而言,这一点可能很重要.如果不使用镜像,那么就没有带外访问代码,因此修剪就变得可行了.
- 镜像可以用于远程代码,而不仅仅是本地代码,因为您不需要反射的对象与镜像位于同一个隔离或虚拟机中.
以下是镜像与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);
}
}