【问题标题】:Find library declared in another file查找在另一个文件中声明的库
【发布时间】:2014-08-25 00:02:47
【问题描述】:

我正在尝试在 dart 中调用对象的方法,该方法使用 dart:mirrors 进行镜像。我想使用的对象是一个类的实例,它在另一个文件的库中定义。

ma​​in.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'
...

我可以在 ma​​in.dart 中添加库的导入语句,一切都很好

import 'test.dart';

但我只在运行时才知道库的名称。

如何在运行时导入库或有不同的方法?

【问题讨论】:

  • 您目前无法动态地将代码添加到正在运行的 Dart 应用程序中。最终可能会添加此功能。您可以做的是导入所有可能的库。
  • @GünterZöchbauer DeferredLibrary 没有帮助?
  • 很遗憾,没有,当您构建到 JavaScript 时,您会得到一个整体 JavaScript 文件,该文件将在执行代码之前完全加载。使用deferred loading,您可以从主包中拆分库并按需加载。但是您仍然必须导入库。 deferred loading 也适用于其他场景(普通 Dart),但我认为使用这种场景会更清楚地证明这一点。
  • 唯一可能有帮助的功能是隔离。您可以从 Dart 或 JavaScript 文件中开始隔离,这些文件在主要隔离代码的编译时是未知的。但是隔离在它们自己的空间中运行,目前只允许在它们之间传递序列化数据。例如,无法从不是主要隔离区的隔离区访问 DOM。
  • 我忘了说,我正在编写一个命令行应用程序。您将如何导入所有可能的库?

标签: dart dart-mirrors


【解决方案1】:

在有更好的解决方案之前,我会使用一个简单的解决方法。我调用另一个程序,将所有必要的导入添加到我的主文件并执行它:

import 'dart:io';

main(List<String> args) {
  var template = new File('main.dart');
  var tmp = new File('tmp.dart');

  template.readAsString().then((String contents) {
    // add necessary imports to template
    var imp = args[0];
    var code = "import '$imp.dart';\n" + contents;
    tmp.writeAsStringSync(code);
    // run modified template
    var cmdArgs = [tmp.absolute.path];
    cmdArgs.addAll(args);
    Process.run('dart', cmdArgs).then((ProcessResult results) {
      print(results.stdout);
    });
  });
}

由于我正在编写一个命令行应用程序,这还不错。

【讨论】:

  • 我最近使用了类似的方法,但开始与生成的代码隔离。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 2021-11-09
  • 2021-05-28
  • 1970-01-01
相关资源
最近更新 更多