2014-11-14 30 views
1

尝试访问私有(包内部)字段让我处于一种奇怪的情况。 我的类“属性”有一个名为'_forceAccum'的内部字段。 试图获得它的价值使用此代码对我失败:使用镜像访问库内部字段

InstanceMirror bodyMirror = reflect(props); 
var value = propsMirror.getField(new Symbol('_forceAccum')); 

,但如果我用这个来代替:

InstanceMirror bodyMirror = reflect(props); 
var value = propsMirror.getField(new Symbol('[email protected]')); 

它的工作原理。 (我从遍历类镜像的符号(.toString())中获得了“@ ...”)。

它应该这样工作吗?它是安全的还是会在下一个版本中改变? (我正在使用1.7.2) 还是只是纯粹偶然的工作?

回答

3

你的问题是,你有一个库私人名称,它的名字不只是_forceAccum,这是关系到_forceAccum特殊符号所独有的图书馆,但不同于一个_forceAccum在另一个库。

创建使用镜子专用符号,你必须使用MirrorSystem.getSymbol为:MirrorSystem.getSymbol("_forceAccum", libraryMirrorOfLibrary)。这为该特定图书馆创建了图书馆 - 私人标志。如果没有指定专用的库,或者在库中(#_forceAccum将为其所在的库创建正确的符号),则不能创建私有符号。

另一种选择,你用它,是通过图书馆查阅资料,发现已经存在的符号有:

var forceAccumSymbol = 
    libraryMirrorOfLibrary.declarations.keys 
          .where((n) => MirrorSystem.getName(n) == "_forceAccum") 
          .first; 

(如果该声明是一个顶级声明)。

您看到的[email protected]这个名字是虚拟机使名称库变为私有的方式。如果使用dart2js进行编译,它不会起作用,并且每次运行时可能不会有相同的something,所以您不能将它放入代码中。

2

该行为不能保证。

如果你在同一个库中,你可以自己构建符号(使用#_forceAccumconst Symbol("_forceAccum")new Symbol("_forceAccum"))。

去从库外的符号,最好的办法可能是觉得(与toString()测试,然后进行缓存。