Sie müssen den Namen der Bibliothek und Klasse wissen Name, um Dinge richtig zu machen. Angenommen, Sie kennen beide, das folgende Beispiel instanziiert die TestClass
und rufen Sie doStuff
darauf.
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();
});
}
Ein paar Anmerkungen zu dieser Lösung:
- Die Bibliothek
test
wir versuchen, aus der Klasse zu laden ist bereits in der VM importiert, die diesen Fall ein bisschen einfacher macht.
- der Aufruf der
newInstance
ermöglicht die Übergabe von Parametern an den Konstruktor. Positionsargumente werden implementiert, benannte Parameter sind jedoch noch nicht implementiert (ab Release M2).
newInstance
gibt Future zurück, damit es über isolates funktioniert.
'newInstance' gibt keine' Zukunft' zurück, da das Instanziieren der Klasse eine asynchrone Operation erfordert, das ist nicht wahr, alles ist bereits geladen. Es gibt eine 'Zukunft' zurück, da die Mirrors-API absichtlich asynchron ist, da sie in der Zukunft isolationsübergreifend funktioniert (und die Kommunikation übergreifend immer asynchron ist). Wenn Sie den 'newInstance'-Aufruf (und andere wie 'get/setField' oder' invoke') sorgfältig untersuchen, werden Sie feststellen, dass er unter der Haube synchron arbeitet. Das könnte sich in Zukunft natürlich ändern. – Ladicek
Dank Ladicek. Ich habe die Antwort aktualisiert. – Kyrra
Hinweis: Dies funktioniert möglicherweise nicht, wenn es in JavaScript kompiliert wird. Der dart2js-Compiler unterstützt Spiegel noch nicht vollständig. –