对于许多用途,我认为镜像与 Java 反射没有什么不同。了解镜像最重要的一点是它们将反射 API 与标准对象 API 解耦,因此您使用反射 (obj) 代替 obj.getClass()。这是一个看似很小的差异,但它为您提供了一些好处:
- 对象 API 没有被污染,并且没有通过覆盖反射方法来破坏反射的危险。
- 您可能有不同的镜像系统。比如说,不允许访问私有方法。这最终可能对工具非常有用。
- 镜像系统不必包括在内。对于编译为 JS,这可能很重要。如果不使用镜像,则没有带外访问代码,修剪变得可行。
- 可以使镜像在远程代码上工作,而不仅仅是本地代码,因为您不需要反射对象与镜像位于相同的 Isolate 或 VM 中。
以下是在 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);
}
}