Dart动态类加载

4
我想用Dart构建一个应用程序服务器。在 dart:io 库中的 httpServer 绝对是一个很好的起点。但是我遇到了一个问题,如何“部署”一个应用程序而不重启服务器进程。
更明确地说:我想要像Java中的Servlet容器Tomcat那样的东西,可以轻松部署或重新部署应用程序而不必重启容器。我认为我可以利用Mirror System,它原则上允许我从文件系统加载库及其包含的类。但不幸的是,似乎我无法重新加载库。例如,当我向库添加一个新类或更改现有类的编码时,在不重启Dart进程的情况下,新的反射库并不会反映出这些更改。只有当我停止进程并重新启动时,更改才会显示出来。
所以:是否有一种方式可以清除Mirror System,并让它在同一个Dart进程中再次加载库及其类?
2个回答

1

非常好!确实,在每个新的隔离中,MirrorSystem会重新镜像库。但这会带来性能影响。执行“Dartlet”的时间从约0.3毫秒增加到约30.0毫秒。因此,我不会在每个请求时重新加载库,而是只有在触发“部署”事件时才重新加载。 - Gregor
感谢您的反馈! - Günter Zöchbauer

1
在Dart中动态重新加载dart文件是可能的。每个新的isolate都有自己的MirrorSystem。如果要重新加载dart文件,则必须创建一个新的isolate,并使用该isolate的MirrorSystem来迭代此MirrorSystem已知的库中的内容。如果您的dart文件是MirrorSystem已知的库的一部分,则会重新加载并反映其中包含的所有函数和类。
这种解决方案有一些缺点:首先,它很重量级,交叉isolate通信的编程也很麻烦。此外,需要看到每次重新加载是否会增加内存消耗。其次,该解决方案不是真正的动态:isolate仅加载在设计时“已知”的库。它们必须直接或间接地导入到包含静态函数的dart文件中,在创建isolate时调用该函数。
以下是两个改进这种情况的想法: 1. 如果Isolate的spawn和spawnUri方法可以获取一个额外的库列表作为参数,则会有所帮助,这些库将包含在isolate的MirrorSystem中。 2. Java中的类装载器与进程和线程无关。 它们只负责加载类。 为什么在Dart中不可能实现这点?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接