如果我有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);
}
将进行测试以检查它是否不是以下划线开头,因此如果可以保证所有符号都是以这种方式生成的,则将防止生成任何“私有符号”?
通过反射,您可以克服所有隐私机制。所以不,您不能依靠它。将“ _foo”视为带有用户无法生成的库令牌前缀的“ foo”。因此,#_bar
主库#_bar
中的lib
库与库中的库不同。但是,您可以枚举给定foo
对象的所有标识符并找到私有函数。
如果您需要真正的隐私,则需要使用隔离。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句