2

我想在飞镖的对象中获取私有变量。

这个变量没有吸气剂,所以我想通过反射来做到这一点。

我尝试了很多方法,但对我没有任何作用。

例如,当我这样做时:

var reflection = reflect(this);
InstanceMirror field = reflection.getField(new Symbol(fieldName));

我收到一个错误:

fieldName 没有 getter。这很正常,因为变量没有吸气剂。

我怎样才能得到这个变量?

使用测试代码编辑:

这是我的反射测试(测试变量是反射类(MyClass))

reflectClass(Injector).declarations.keys.forEach((e) => test.getField(e, test.type.owner))

我收到此错误:

类“_LocalInstanceMirror”没有具有匹配参数的实例方法“getField”。

如果我这样做:

reflectClass(Injector).declarations.keys.forEach((e) => test.getField(e))

我得到:

类“DynamicInjector”没有实例获取器“_PRIMITIVE_TYPES@0x1b5a3f8d”。

与声明的值相同。

4

2 回答 2

1

您收到的错误消息实际上是正确的。该类具有该字段的吸气剂。Dart 为所有非最终/非 const 字段隐式创建 getter 和 setter。

Dart2JS 似乎还不支持访问私有成员。见https://code.google.com/p/dart/issues/detail?id=13881

这是一个如何访问私有字段的示例:(来自https://code.google.com/p/dart/issues/detail?id=16773的示例)

import 'dart:mirrors';

class ClassWithPrivateField {

  String _privateField;
}

void main() {

  ClassMirror classM = reflectClass(ClassWithPrivateField);
  Symbol privateFieldSymbol;
  Symbol constructorSymbol;
  for (DeclarationMirror declaration in classM.declarations.values) {
    if (declaration is VariableMirror) {
      privateFieldSymbol = declaration.simpleName;
    } else if (declaration is MethodMirror && declaration.isConstructor) {
      constructorSymbol = declaration.constructorName;
    }
  }

  // it is not necessary to create the instance using reflection to be able to
  // access its members with reflection
  InstanceMirror instance = classM.newInstance(constructorSymbol, []);

  // var s = new Symbol('_privateField'); // doesn't work for private fields

  // to create a symbol for a private field you need the library 
  // if the class is in the main library
  // var s = MirrorSystem.getSymbol('_privateField', currentMirrorSystem().isolate.rootLibrary);
  // or simpler
  // var s = MirrorSystem.getSymbol('_privateField', instance.type.owner); 
  for (var i=0; i<1000; ++i) {
    instance.setField(privateFieldSymbol, 'test');
    print('Iteration ${instance.getField(privateFieldSymbol)}');
  }
}
于 2014-04-02T14:36:09.783 回答
0

使用dsonserializable您可以通过以下方式执行此操作:

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']}");
}
于 2018-02-10T19:17:50.683 回答