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
相关产品推荐
相关产品推荐

