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

时间:2015-02-19 04:46:38

标签: dart dart-mirrors

我可以使用反射来访问和调用我的库之外的类的私有方法。这是一个错误还是想要的行为?如果需要,我怎样才能让外部代码无法访问私有成员/方法?

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
  });
}

2 个答案:

答案 0 :(得分:3)

此隐私不是安全功能,仅与您的API用户进行通信,此类方法仅供内部使用。无法阻止使用镜像进行访问。

在镜像中禁止它不会阻止访问,因为VM和dart2js只是修改或添加私有方法名称前缀以防止与公共方法发生名称冲突。可以使用强力预测或找到这些名称,然后进行调用。

答案 1 :(得分:0)

调用私有方法在编写DSL(域特定语言)时非常有用。