2013-01-09 77 views

回答

3

你需要知道的庫名和類名稱使事情正常工作。假設你們都知道,下面的例子將實例化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(); 
    }); 
} 

這個解決方案的幾個注意事項:

  1. test我們要加載從已經在虛擬機,這使得這種情況下,更容易一些進口類。
  2. 調用newInstance允許將參數傳遞給構造函數。位置參數已實現,但命名參數尚未實現(截至M2版本)。
  3. newInstance返回Future以允許它在isolates之間工作。
+0

'newInstance'不會返回'Future',因爲實例化類可能需要異步操作,事實並非如此,所有內容都已經加載。它返回一個'Future',因爲Mirrors API是故意異步的,因爲它將在未來的跨隔離區中工作(並且跨隔離通信總是異步的)。如果仔細檢查'newInstance'調用(以及其他類似'get/setField'或'invoke'),您將會注意到在引擎蓋下它同步工作。未來可能會發生明顯變化。 – Ladicek

+0

謝謝Ladicek。我已經更新了答案。 – Kyrra

+0

注意:編譯爲JavaScript時可能無法使用。 dart2js編譯器尚未完全支持鏡像。 –

4

語法已更改。 我得到了它,如果有一個名爲「測試」更多的圖書館雖然這將無法以這種方式工作

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(); 
} 

+0

確實,'class' getter已經被改爲'declarations'。 – snitko

相關問題