为什么我可以使用反射来调用外部class的私有方法?

Why can I use reflection to call private methods of an external class?

我可以使用反射来访问和调用库外 class 的私有方法。这是错误还是期望的行为?如果需要,如何使外部代码无法访问私有 members/methods?

library left;

class Thing {
  void _priv(String s) {
    print(s);
  }
}

library right;

void main() {
  var t = new Thing();
  var mirror = reflect(t);

  mirror.type.declarations.values
  .where( (d) => d.isPrivate && d is MethodMirror )
  .forEach( (d) {
    print(d.simpleName == #_priv); // prints false
    mirror.getField(d.simpleName).reflectee("Hello World"); // prints Hello World
  });
}

此隐私不是一项安全功能,只是为了向 API 的用户传达这种方法仅供内部使用。无法阻止使用镜像的访问。

在镜像中禁止它不会阻止访问,因为 VM 和 dart2js 只是破坏或前缀私有方法名称以防止名称与 public 方法冲突。可以使用蛮力预测或找到这些名称,然后调用这些名称。

调用私有方法主要用于编写 DSL(领域特定语言)。