从字符串中实例化一个类

1da*_*ake 10 dart dart-mirrors

在dart中是否可以从字符串中实例化一个类?

例如:

  • javascript中的香草:
var myObject = window[classNameString];
Run Code Online (Sandbox Code Playgroud)
  • Objective-C的:
id myclass = [[NSClassFromString(@"MyClass") alloc] init];
Run Code Online (Sandbox Code Playgroud)

小智 5

尝试:

Map models = {"Player": Player.instantiate};
var player = models["Player"]();

class Player{
  static instantiate() => Player();
}
Run Code Online (Sandbox Code Playgroud)


Kyr*_*rra 4

您需要知道库名称和类名称才能正常工作。假设您都知道,下面的示例将实例化TestClass并调用doStuff它。

library test;

import "dart:mirrors";

class TestClass {
  doStuff() => print("doStuff was called!");
}

main() {
  MirrorSystem mirrors = currentMirrorSystem();
  LibraryMirror lm = mirrors.libraries['test'];
  ClassMirror cm = lm.classes['TestClass'];
  Future tcFuture = cm.newInstance('', []);
  tcFuture.then((InstanceMirror im) {
    var tc = im.reflectee;
    tc.doStuff();
  });
}
Run Code Online (Sandbox Code Playgroud)

关于此解决方案的一些注意事项:

  1. 我们test尝试从中加载类的库已经导入到虚拟机中,这使得这种情况变得更容易一些。
  2. 该调用newInstance允许将参数传递给构造函数。位置参数已实现,但命名参数尚未实现(截至 M2 版本)。
  3. newInstance返回一个Future以允许它跨隔离工作。