首页 文章

查找在另一个文件中声明的库

提问于
浏览
2

我试图在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语句,一切都很好

import 'test.dart';

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

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

1 回答

  • 2

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

    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);
        });
      });
    }
    

    由于我正在编写一个命令行应用程序,这不是太糟糕 .

相关问题