【问题标题】:Invoke top level function with dart:mirrors使用 dart:mirrors 调用顶级函数
【发布时间】:2021-05-20 21:34:12
【问题描述】:

我正在努力解决如何在 dart 中调用顶级函数。我希望能够用@Route 注释一个函数,找到所有Route 注释,然后检查该注释是否在一个方法上,然后通过其符号调用该方法。

到目前为止我所拥有的是:

class Route {
  final String url;
  const Route(this.url);
}

@Route('/')
void handle() {
  print('Request received');
}

void main() {
  var mirrorSystem = currentMirrorSystem();
  var lm = mirrorSystem.isolate.rootLibrary;
  for (var mirror in lm.declarations.values) {
    var metadata = mirror.metadata;
    for (var im in metadata) {
      if (im.reflectee is Route) {
        print('Route found');
        // how to invoke the function handle associated with the route annotation?
      }
    }
  }
}

从这一点开始,我不确定我将如何调用该方法。如果它是一个类,那么我可以使用invoke 并将Symbol 传递给该方法,但这不起作用,因为它不是一个类。

谁能给我一些线索?不幸的是,关于 dart 中的 mirrors 库的信息相当稀少。

【问题讨论】:

    标签: dart dart-mirrors


    【解决方案1】:

    我解决了这个问题。对于发现此问题的任何人,您可以使用 rootLibrary 上的 LibraryMirror 来调用顶级函数:

    void main() {
      var mirrorSystem = currentMirrorSystem();
      var lm = mirrorSystem.isolate.rootLibrary;
      for (var mirror in lm.declarations.values) {
        var metadata = mirror.metadata;
        for (var im in metadata) {
          if (im.reflectee is Route && mirror is MethodMirror) {
            lm.invoke(mirror.simpleName, []);
            // prints 'Request received'
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 2015-10-31
      • 2015-06-09
      • 2021-08-10
      相关资源
      最近更新 更多