You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart通过Mirror API反射调用方法时如何获取invoke返回结果

核心原因

InstanceMirror.invoke() 的返回值固定为InstanceMirror类型,不会自动识别异步方法做解包:无论被调用的方法是同步/异步,该返回值都只是包裹了方法原始返回对象的镜像实例,必须通过镜像的reflectee字段才能取出真实的返回对象。
示例中doWork()是async标记的异步方法,原始返回值为Future<MyData>,因此invoke拿到的镜像里包裹的就是这个Future实例,直接解析无法得到最终的MyData结果。

可运行修正代码
import 'dart:mirrors';

class MyData {
  String? someString;
}

class MyService {
  Future<MyData> doWork() async {
    print('doing work');
    return await Future(() => MyData()..someString = 'my result');
  }
}

void main() async {
  var instance = MyService();
  var mirror = reflect(instance);
  // 拿到包裹doWork返回值的镜像
  final invokeResultMirror = mirror.invoke(#doWork, []);
  // 取出真实的Future对象,等待异步执行完成拿到最终结果
  final MyData realResult = await invokeResultMirror.reflectee;
  // 正常访问结果属性
  print(realResult.someString); // 控制台输出 my result
}
注意事项
  • 同步方法调用场景下,无需await,直接读取invoke返回的镜像.reflectee就能拿到同步返回值
  • 禁止直接对InstanceMirror实例做await/then调用,必须先取出reflectee对应的真实对象再操作
  • 若拿到真实返回结果后仍需要做反射操作,可对真实对象再次调用reflect()生成新的镜像实例使用

内容的提问来源于stack exchange,提问作者devklick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:48:14