Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过dart中的反射获取私有变量_Dart_Dart Mirrors - Fatal编程技术网

通过dart中的反射获取私有变量

通过dart中的反射获取私有变量,dart,dart-mirrors,Dart,Dart Mirrors,我想在dart中的对象中获取私有变量 这个变量没有getter,所以我想用反射来实现 我试了很多方法,但都不管用 例如,当我这样做时: var反射=反射(此); InstanceMirror字段=reflection.getField(新符号(字段名)); 我得到一个错误: fieldName没有getter。 这是正常的,因为变量没有getter 我怎样才能得到这个变量 使用测试代码编辑: 这是我的reflect测试(测试变量是reflectClass(MyClass)) reflectCl

我想在dart中的对象中获取私有变量

这个变量没有getter,所以我想用反射来实现

我试了很多方法,但都不管用

例如,当我这样做时:

var反射=反射(此);
InstanceMirror字段=reflection.getField(新符号(字段名));
我得到一个错误:

fieldName没有getter。 这是正常的,因为变量没有getter

我怎样才能得到这个变量

使用测试代码编辑:

这是我的reflect测试(测试变量是reflectClass(MyClass))

reflectClass(Injector).declarations.keys.forEach((e)=>test.getField(e,test.type.owner))
我得到这个错误:

类“\u LocalInstanceMirror”没有具有 匹配参数

如果我这样做:

reflectClass(Injector).declarations.keys.forEach((e)=>test.getField(e))
我得到:

类“DynamicInputor”没有实例getter “"_TYPES@0x1b5a3f8d"


声明的值也是如此。

您得到的错误消息实际上是正确的。该类具有此字段的getter。 Dart隐式地为所有字段创建getter,为所有非final/non const字段创建setter

Dart2JS似乎还不支持访问私有成员。 看

下面是如何访问专用字段的示例: (示例来自)

导入“dart:mirrors”;
类带有privateField{
字符串_privateField;
}
void main(){
ClassMirror classM=反射类(ClassWithPrivateField);
符号私有字段符号;
符号构造符号;
for(classM.declarations.values中的DeclarationMirror声明){
if(声明为VariableMirror){
privateFieldSymbol=declaration.simpleName;
}else if(声明为MethodMirror&&declaration.isConstructor){
constructorSymbol=declaration.constructorName;
}
}
//不必使用反射创建实例,就可以
//通过反射访问其成员
InstanceMirror实例=classM.newInstance(构造函数符号,[]);
//var s=新符号(“_privateField”);//不适用于私有字段
//要为专用字段创建符号,需要库
//如果类位于主库中
//var s=MirrorSystem.getSymbol(“'u privateField',currentMirrorSystem().isolate.rootLibrary”);
//或者更简单
//var s=MirrorSystem.getSymbol(“'u privateField',instance.type.owner”);
对于(var i=0;i使用,或者您可以用下一种方法执行:

library example_lib;
import 'package:dson/dson.dart';

// this should be the name of your file
part 'example.g.dart';

@serializable
class Example extends _$ExampleSerializable {
  var _privateVar;
}

main() {
  var example = new Example();
  example['_privateVar'] = 'some value';

  print('example._privateVar: ${example._privateVar}');
  print('example["_privateVar"]: ${example["_privateVar']}");
}

糟糕的是,它不起作用,可能是我做错了什么。我用我的代码编辑我的帖子
声明中的键对我也不起作用(相同的错误)。但是使用
声明.simpleName
或其他两个(注释掉的)变体之一为私有字段创建符号对我有效。你看到了吗?