检索与镖吸气值:镜反射(Retrieving getter values with dart:mir

2019-10-17 14:53发布

我有以下代码(简化的),即使用反射来遍历一个类的字段以及getter并输出该值。 该ContainsGetter类包含一个getter和ContainsField类包含一个简单的现场。

使用dart:mirrors库,我可以用得到的字段的值instanceMirror.getField(fieldName)通过使用),而不是吸气instanceMirror.invoke(fieldName,[])

下面飞镖脚本(使用构建17463)给出了下面的输出:

应用程序脚本

import 'dart:mirrors';

class ContainsGetter { // raises an error
  String get aGetter => "I am a getter";
}

class ContainsField { // works fine
  String aField = "I am a field";
}

void main() {
  printFieldValues(reflect(new ContainsField()));
  printGetterValues(reflect(new ContainsGetter()));
}

void printFieldValues(instanceMirror) {
  var classMirror = instanceMirror.type;
  classMirror.variables.keys.forEach((key) {
    var futureField = instanceMirror.getField(key); // <-- works ok
    futureField.then((imField) => print("Field: $key=${imField.reflectee}"));
  });
}

void printGetterValues(instanceMirror) {
  var classMirror = instanceMirror.type;
  classMirror.getters.keys.forEach((key) {
    var futureValue = instanceMirror.invoke(key,[]); // <-- fails
    futureValue.then((imValue) => print("Field: $key=${imValue.reflectee}"));
  });
}

产量

Field: aField=I am a field
Uncaught Error: Compile-time error during mirrored execution: <Dart_Invoke: did not find instance method 'ContainsGetter.aGetter'.>
Stack Trace:
#0      _LocalObjectMirrorImpl._invoke (dart:mirrors-patch:163:3)
#1      _LocalObjectMirrorImpl.invoke (dart:mirrors-patch:125:33)

(可接受的可能是“该位只是还没有被写!”)

Answer 1:

啊哈,我刚刚工作了。 虽然aGetter就像是在其实施的方法,你可以使用getField()而不是invoke来检索其值。

void printGetterValues(instanceMirror) {
  var classMirror = instanceMirror.type;
  classMirror.getters.keys.forEach((key) {
    var futureValue = instanceMirror.getField(key); // <-- now works ok
    futureValue.then((imValue) => print("Field: $key=${imValue.reflectee}"));
  });
}


文章来源: Retrieving getter values with dart:mirrors reflection