2013-12-15 68 views
1

對於給定的例子:如何獲得Dart中某個類的所有子類?

class Base { 
    static abstract void foo(); 
} 

class ChildA extends Base{ 
    static void foo(){}; 
} 

class ChildB extends Base{ 
    static void foo(){}; 
} 

我想找到「基地」的子類(調用每個FOO)。 我需要在構建時找到它(不需要運行時間)。 我唯一的想法是使用反射。但是我不知道如何從ClassMirror訪問類?

這是我到目前爲止有:

final mirror = currentMirrorSystem(); 
mirror.libraries.forEach((uri, libMirror) { 
    libMirror.classes.forEach((name, ClassMirror classMirror) { 
     try { 
      while ((classMirror = classMirror.superclass) != null) { 
       if (MirrorSystem.getName(classMirror.qualifiedName) == ".Base") { 
        //this is the classMirror of class i want 
        //but i have no idea how to access it 
        //or how to call foo() on it 
        print(classMirror); 
        print(classMirror.simpleName.toString()); 
       } 
      } 

     } catch(e) { 
      print(e); 
     } 
    }); 
}); 

如前所述,我不需要這個在運行時,所以也許完全不同的方法可以解決這個問題。如果不是,問題是:我如何調用foo()?

在此先感謝。

回答

0

對不起球員,也許是這樣的相關功能的工作比搜索更好或者也許我的研究是不夠硬,但無論如何,我發現這一點:

Find all subclasses in dart

答案也有建議使用鏡子。 因此,要回答我的問題的方式來調用靜態方法foo是使用invoke方法:

classMirror.invoke(#foo, []); 

但是,這仍然可能不是最佳的解決方案,也許有更好的方法在編譯的時候做到這一點?

+0

看起來您已經解決了您的問題;)顯然,也可以在源代碼中使用「源代碼鏡像」,而無需實際將其加載到虛擬機中。但我還沒有看到有關如何使用它的任何內容。這個代碼可能被埋在dart2js源代碼中。您可以查看docgen工具以獲取如何使用該工具的示例。還有一些關於「鏡像構建器」的討論,它們允許您使用鏡像API來擴展和修改程序。但就目前而言 - 我認爲你所做的可能是最好的方式。即在構建時查找類,然後生成源代碼以包含 –

+0

您可以調用靜態方法爲Function.apply(ClassB.foo,[]);不需要鏡子。但是如果你想動態地從每個子類獲取方法,那將需要鏡像。 –

相關問題