Dart镜像行为是不允许从其他库保证调用私有方法和部分规范?

Dan*_*son 2 dart dart-mirrors

如果我有2个文件:

bin.dart:

import 'lib.dart';
import 'dart:mirrors';

/*
class Foo{
  bool _bar() => true;
}
*/

void main() {
  var foo = new Foo();
  print(reflect(foo).invoke(#_bar, []));
}
Run Code Online (Sandbox Code Playgroud)

lib.dart:

library lib;

class Foo{
  bool _bar() => true;
}
Run Code Online (Sandbox Code Playgroud)

如果我运行bin.dart,我会得到我希望发生的事情,尝试调用私有方法时会出现异常.但是如果我注释掉该import 'lib.dart'行并取消注释本地Foo定义,这个timeit运行无例外,我想这是好的,因为现在从声明库中调用了私有方法.所以我的问题是,行为是否得到保证?我需要确保通过我的库中的镜像调用点不允许从其他库调用私有成员,目前我通过检查以_开头的名称来明确检查:

if(MirrorSystem.getName(inv.method).startsWith('_')){
  throw new RestrictedMethodError(inv.method);
}else{
  _this.invoke(inv.method, inv.posArgs, inv.namArgs);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果默认情况下仍然尊重隐私,那么我可以摆脱这个检查并删除我的库中的dart:mirror的导入,谢谢.

UPDATE

如果inv.method保证符号始终来自以下内容,该怎么办?

inv.method = MirrorSystem.getSymbol(stringName);
Run Code Online (Sandbox Code Playgroud)

这会阻止在文件dart:mirrors-patch_mirrors_patch.dart行92中调用私有方法:

  static Symbol getSymbol(String name,[LibraryMirror library]) {
    if((library != null && library is !_LocalLibraryMirror) ||
       ((name.length > 0) && (name[0] == "_") && (library == null))) {
      throw new ArgumentError(library);
    }
    if (library != null) name = _mangleName(name, library._reflectee);
    return new _symbol_dev.Symbol.unvalidated(name);
  }
Run Code Online (Sandbox Code Playgroud)

将进行测试以检查它是否以下划线开头,因此如果您能保证以这种方式生成所有符号,那么是否会阻止生成任何"私有符号"?

Flo*_*sch 5

反射允许您克服所有隐私机制.所以不,你不能依赖它.将"_foo"视为"foo",前缀为用户无法生成的库令牌.这样,#_bar在主库不同于#_barlib库中.但是,您可以枚举给定foo对象的所有标识符并查找私有函数.

如果您需要真正的隐私,您需要使用隔离.