È necessario conoscere il nome della libreria e la classenome per far funzionare le cose correttamente. Supponiamo che tu conosca entrambi, l'esempio seguente instanzia il TestClass
e chiama doStuff
su di esso.
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();
});
}
Alcune note su questa soluzione:
- La biblioteca
test
che stiamo cercando di caricare la classe da già importato nella VM, che rende questo caso, un po 'più facile.
- la chiamata
newInstance
consente di passare parametri al costruttore. Gli argomenti posizionali sono implementati, ma i parametri con nome non sono ancora implementati (come nella versione M2).
newInstance
restituisce un Future per consentirne il funzionamento su isolates.
'newInstance' non restituisce un' Future' perché l'istanziazione della classe potrebbe richiedere un'operazione asincrona, non è vero, tutto è già caricato. Restituisce un 'Future' perché l'API Mirrors è intenzionalmente asincrona, in quanto funzionerà su tutti gli isolati in futuro (e la comunicazione cross-isolate è sempre asincrona). Se ispezionate attentamente l'invocazione 'newInstance' (e altri come' get/setField' o 'invoke' troppo), noterete che sotto il cofano funziona in modo sincrono. Ciò potrebbe ovviamente cambiare in futuro. – Ladicek
Grazie Ladicek. Ho aggiornato la risposta. – Kyrra
Nota: questo potrebbe non funzionare quando compilato in JavaScript. Il compilatore dart2js non supporta ancora pienamente i mirror. –