【发布时间】:2014-08-25 00:02:47
【问题描述】:
我正在尝试在 dart 中调用对象的方法,该方法使用 dart:mirrors 进行镜像。我想使用的对象是一个类的实例,它在另一个文件的库中定义。
main.dart
import 'dart:mirrors';
main(List<String> args) {
var libName = args[0];
var className = args[1];
var methodName = args[2];
MirrorSystem mirrors = currentMirrorSystem();
LibraryMirror lm = mirrors.findLibrary(new Symbol(libName));
ClassMirror cm = lm.declarations[new Symbol(className)];
InstanceMirror im = cm.newInstance(new Symbol(''), []);
im.invoke(new Symbol(methodName), []);
}
我写了另一个文件进行测试:
test.dart
library test;
class TestClass {
doStuff() => print("doStuff was called!");
}
如果我运行 main.dart 我会得到一个异常:
dart main.dart test TestClass doStuff
Unhandled exception:
Exception: There is no library named 'test'
...
我可以在 main.dart 中添加库的导入语句,一切都很好
import 'test.dart';
但我只在运行时才知道库的名称。
如何在运行时导入库或有不同的方法?
【问题讨论】:
-
您目前无法动态地将代码添加到正在运行的 Dart 应用程序中。最终可能会添加此功能。您可以做的是导入所有可能的库。
-
@GünterZöchbauer
DeferredLibrary没有帮助? -
很遗憾,没有,当您构建到 JavaScript 时,您会得到一个整体 JavaScript 文件,该文件将在执行代码之前完全加载。使用
deferred loading,您可以从主包中拆分库并按需加载。但是您仍然必须导入库。deferred loading也适用于其他场景(普通 Dart),但我认为使用这种场景会更清楚地证明这一点。 -
唯一可能有帮助的功能是隔离。您可以从 Dart 或 JavaScript 文件中开始隔离,这些文件在主要隔离代码的编译时是未知的。但是隔离在它们自己的空间中运行,目前只允许在它们之间传递序列化数据。例如,无法从不是主要隔离区的隔离区访问 DOM。
-
我忘了说,我正在编写一个命令行应用程序。您将如何导入所有可能的库?
标签: dart dart-mirrors