dart - 为什么可以使用反射来调用外部类的私有(private)方法?

标签 dart dart-mirrors

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

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 只是修改或添加私有(private)方法名称前缀以防止与公共(public)方法发生名称冲突。这些名称可以使用暴力来预测或找到,然后被调用。

关于dart - 为什么可以使用反射来调用外部类的私有(private)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28598757/

相关文章:

flutter - 如何在Flutter中使用本地JSON在我的应用程序中动态创建页面?

dart - 是否可以转换已编译的 javascript,并配置运行转换器的顺序?

dart - 具有可反射lib的DartLang中的注释的simpleName

reflection - 如果我知道函数的名称,是否可以获取其参数?

dart - 获取所有具有注释的类的 ClassMirror 实例

dart - 如何检查列表是否包含列表,以及如何从列表中删除列表

flutter - 向 TextButton 添加尾随图标?

regex - 如何将所有正则表达式匹配项放入字符串列表

Dart镜像API : Getting the result of a reflection call

dart - Dart-类来自字符串-类实例来自字符串