Dart镜像行为是否保证不能保证从其他库中调用私有方法并且属于规范的一部分?

丹尼尔·罗宾逊(Daniel Robinson)

如果我有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, []));
}

lib.dart:

library lib;

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

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

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

但是,如果默认情况下甚至仍然通过镜像尊重隐私,那么我可以摆脱此检查并删除我库中dart:mirrors的导入。

更新

如果inv.method保证该符号始终来自于该怎么办

inv.method = MirrorSystem.getSymbol(stringName);

那么这将防止在文件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);
  }

将进行测试以检查它是否不是以下划线开头,因此如果可以保证所有符号都是以这种方式生成的,则将防止生成任何“私有符号”?

弗洛里安·洛伊奇(Florian Loitsch)

通过反射,您可以克服所有隐私机制。所以不,您不能依靠它。将“ _foo”视为带有用户无法生成的库令牌前缀的“ foo”。因此,#_bar主库#_bar中的lib中的不同但是,您可以枚举给定foo对象的所有标识符并找到私有函数。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Nunit 测试 - 测试被公共方法调用的私有方法代码的一部分

数组和对象中的尾部逗号是否属于规范的一部分?

检查值是否属于其他列 Pandas Python 中的值的一部分

如何保证属性是接口的一部分?

检查选择中的值是否为其他值集的一部分

将方法的一部分放入其他方法中返回null

基类私有成员属于派生类的哪一部分?

for循环的替代方法| 如何检查单词是否包含其他单词的一部分

Python检查dict是否是其他dict的一部分

如何从Dart中的其他库覆盖私有方法?

保留网址的第一部分,并遮盖其他所有内容

Flutter / Dart中是否可以显示图像的一部分

在其他终端中运行脚本的一部分

是否可以检查Google帐户是否属于Google+中特定社区的一部分

如何重写现有类FlysystemAssetStore的现有方法,该类是SilverStripe框架的一部分

如何确定产品是否属于Shopify液体模板中的隐藏集合的一部分?

是否有可能将结构的一部分借为可变的而将其他部分借为不变的?

Bootstrap 卡属于另一部分

标记清单的“标志” /“条件标记”是否属于“ CC”(条件控制)的一部分?

API基础结构类是否应该属于DDD域的一部分?

有没有办法在Python中使用熊猫(或其他库)提取数据框的一部分?

用同一行的其他部分替换行的一部分

静态方法/字段/块是元空间的一部分吗?元空间是否与堆分开并且在本机内存中?

检查xml是否是Java中pdf文档的一部分的最佳方法

如何获得 Laravel 中的属于关系的一部分?

访问结构内部的数组元素(属于结构数组的一部分)(在C中)

根据Pandas中的其他信息更改数据框中列的一部分

Dart检查字符串列表中的一部分字符串是否包含元素

只要它们不是其他单词的一部分,我如何替换 Java 中某个单词的所有实例?