【问题标题】:Dart dynamic class loadingDart 动态类加载
【发布时间】:2014-04-15 18:58:24
【问题描述】:

我想用 Dart 构建一个应用服务器。 dart:io 库中的 httpServer 无疑是一个很好的起点。但是我很难在不重新启动服务器进程的情况下“部署”应用程序。

更准确地说:我希望在 Java 中拥有类似 servlet 容器的东西,例如 Tomcat,我可以轻松地在其中部署或重新部署应用程序,而无需重新启动容器。我想我可以利用镜像系统,它原则上允许我从文件系统加载一个库及其包含的类。但不幸的是,我似乎无法重新加载库。例如,当我向库中添加新类或更改现有类的编码时,库的新反射而不重新启动 dart 进程不会反映更改。只有当我停止进程并重新启动时,更改才会可见。

那么:有没有办法在同一个 Dart 进程中清理镜像系统并让它再次加载库及其类?

【问题讨论】:

    标签: dart dart-isolates


    【解决方案1】:

    我认为隔离很适合这个要求。

    我自己还没有经常使用它们,但据我所知,您可以动态加载和卸载它们。 文档还不是很广泛。 我发现了一些东西:

    【讨论】:

    • 效果很好!实际上,在每个新隔离中,MirrorSystem 都会重新镜像库。但这会带来性能影响。执行“Dartlet”的时间从 ~0.3ms 增加到 ~30.0ms。所以我不会在每次请求时都重新加载库,但前提是触发了“部署”事件。
    • 感谢您的反馈!
    【解决方案2】:

    所以,是的,在 Dart 中可以在运行时动态(重新)加载 dart 文件。每个新的隔离区都有自己的 MirrorSystem。如果你想重新加载一个 dart 文件,你必须创建一个新的隔离并使用这个隔离的 MirrorSystem 来迭代这个 MirrorSystem 已知的库中的内容。如果您的 dart 文件是 MirrorSystem 已知库的一部分,则此文件中包含的所有函数和类都将被加载并重新反映。

    这个解决方案有一些缺点:首先,它是相当重量级的。隔离间通信的编程很麻烦。还要观察每次重新加载是否会增加内存消耗。其次,解决方案不是真正动态的:隔离仅加载在设计时“已知”的库。它们必须直接或间接导入到包含静态函数的 dart 文件中,该静态函数在创建隔离时调用。

    如何改善这种情况的两个想法: 1. 如果Isolate 的spawn 和spawnUri 方法可以获取一个附加库列表作为参数,这将有所帮助,这些库包含在isolate 的MirrorSystem 中。 2、Java中的类加载器独立于进程和线程。他们只是加载类。为什么这在 Dart 中不可能?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2014-09-27
      • 2021-02-08
      • 2012-10-10
      • 2013-05-05
      • 2016-08-02
      • 2012-08-07
      相关资源
      最近更新 更多