在dart中可以從一個字符串實例化一個類?從一個字符串實例化一個類
例如:
- 香草的javascript:
var myObject = window[classNameString];
- 的Objective-C:
id myclass = [[NSClassFromString(@"MyClass") alloc] init];
在dart中可以從一個字符串實例化一個類?從一個字符串實例化一個類
例如:
var myObject = window[classNameString];
id myclass = [[NSClassFromString(@"MyClass") alloc] init];
你需要知道的庫名和類名稱使事情正常工作。假設你們都知道,下面的例子將實例化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();
});
}
這個解決方案的幾個注意事項:
語法已更改。 我得到了它,如果有一個名爲「測試」更多的圖書館雖然這將無法以這種方式工作
library test;
import "dart:mirrors";
class TestClass {
doStuff() => print("doStuff was called!");
}
main() {
MirrorSystem mirrors = currentMirrorSystem();
LibraryMirror lm = mirrors.libraries.values.firstWhere(
(LibraryMirror lm) => lm.qualifiedName == new Symbol('test'));
ClassMirror cm = lm.declarations[new Symbol('TestClass')];
InstanceMirror im = cm.newInstance(new Symbol(''), []);
var tc = im.reflectee;
tc.doStuff();
}
。
確實,'class' getter已經被改爲'declarations'。 – snitko
'newInstance'不會返回'Future',因爲實例化類可能需要異步操作,事實並非如此,所有內容都已經加載。它返回一個'Future',因爲Mirrors API是故意異步的,因爲它將在未來的跨隔離區中工作(並且跨隔離通信總是異步的)。如果仔細檢查'newInstance'調用(以及其他類似'get/setField'或'invoke'),您將會注意到在引擎蓋下它同步工作。未來可能會發生明顯變化。 – Ladicek
謝謝Ladicek。我已經更新了答案。 – Kyrra
注意:編譯爲JavaScript時可能無法使用。 dart2js編譯器尚未完全支持鏡像。 –