我正在尝试在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);
}
}
答案 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处的飞镖序列化,因为它可能已经完全按照你要做的去做了。