2013-12-15 35 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,[]);不需要镜子。但是如果你想动态地从每个子类获取方法,那将需要镜像。 –

相关问题