反射:LibraryMirror中没有函数

时间:2013-10-20 11:41:04

标签: reflection dart dart-mirrors

我正在尝试在Dart中构建一个使用反射的实体管理器。我们的想法是方法 getById(String id,String returnClass)调用方法 _get [returnClass] ById(String id)

为了实现这一点,我正在使用dart:mirrors并尝试确定我的实体管理器对象是否具有这样的方法然后调用它。遗憾的是,LibraryMirror不包含任何函数。

class EntityMgr {

  Object getById(String id, String returnClass) {
    InstanceMirror result = null;
    String methodName = '_get'+returnClass+'ById';

    // Check if a method '_get[returnClass]Byid exists and call it with given ID
    if(_existsFunction(methodName)) {
      Symbol symbol = new Symbol(methodName);
      List methodParameters = new List();
           methodParameters.add(id);

      result = currentMirrorSystem().isolate.rootLibrary.invoke(symbol, methodParameters);
    }

    return result;
  }

  Product _getProductById(String id) {
    return new Product();
  }

  bool _existsFunction(String functionName) {
    return currentMirrorSystem().isolate.rootLibrary.functions.containsKey(functionName);
  } 
}

1 个答案:

答案 0 :(得分:1)

镜像库自此响应后发生了重大变化,不再反映此答案中提到的api

Isolate用于并发编程,您可能没有运行任何隔离。您要查看的位置是currentMirrorSystem().libraries,或者您可以使用currentMirrorSystem().findLibrary(new Symbol('library_name'))

您需要了解该库,因为具有相同Symbol的函数或类可以在不同的库中使用,但具有完全不同的签名。

how to invoke class form dart library string or file显示了如何从库和类名中获取类镜像。

ClassMirror包含方法,getter和setter。方法镜像不包含getter或setter。

final Map<Symbol, MethodMirror> methods
final Map<Symbol, MethodMirror> getters
final Map<Symbol, MethodMirror> setters

话虽这么说,你可能想要查看http://api.dartlang.org/docs/bleeding_edge/serialization.html处的飞镖序列化,因为它可能已经完全按照你要做的去做了。