从包中获取所有类

时间:2014-12-08 11:04:40

标签: haxe

我喜欢以(平台无关的)方式列出包中的所有类。

一种可能的方法是获取Haxe已知的所有类的列表,然后通过它进行过滤。

2 个答案:

答案 0 :(得分:5)

我做了一个宏来帮助解决这个问题。它位于compiletime haxelib。

haxelib install compiletime

然后将其添加到您的构建(hxml文件):

-lib compiletime

然后用它来导入你的类:

// All classes in this package, including sub packages.
var testcases = CompileTime.getAllClasses("my.package"); 

// All classes in this package, not including sub packages.
var testcases = CompileTime.getAllClasses("my.package",false); 

// All classes that extend (or implement) TestCase
var testcases = CompileTime.getAllClasses(TestCase);

// All classes in a package that extend TestCase
var testcases = CompileTime.getAllClasses("my.package",TestCase);

然后你可以迭代它们:

for ( testClass in testcases ) {
    var test = Type.createInstance( testClass, [] );
}

请注意,如果您的代码中没有“import some.package.SomeClass”,那么该类将永远不会包含在内,因为代码消失了。因此,如果您想确保它被包含在内,即使您从未在代码中明确地调用它,也可以执行以下操作:

CompileTime.importPackage( "mygame.levels" );
CompileTime.getAllClasses( "mygame.levels", GameLevel );

工作原理

CompileTime.getAllClasses是一个宏,它的作用是:

  • 等待编译完成,我们知道应用程序中的所有类型/类。
  • 浏览每一个,看看它是否在指定的包中
  • 另请参阅它是否扩展(或实现)指定的类/接口
  • 如果是,请将类名添加到@classLists(...)文件中的一些特殊元数据 - CompileTimeClassList元数据,其中包含所有匹配类的名称。
  • 在运行时,使用元数据和Type.resolveClass(...)一起创建所有匹配类型的列表。

答案 1 :(得分:3)

这是存储和检索信息的一种方法:https://gist.github.com/back2dos/c9410ed3ed476ecc1007

除此之外,您可以使用haxe -xml获取所需的类型信息,然后根据需要对其进行转换(使用haxe.rtti中的解析器来处理数据)并使用{{嵌入JSON编码结果1}}(通过-resource theinfo.json访问)。

作为旁注:有可能你最好没有任何自动化,只需手动将类添加到数组中。想象一下,你有haxe.Resourcesomepackage.ClassA,...然后就可以了

somepackage.ClassB

它为您提供了更多的灵活性,无论您想做什么,您都可以随时添加第三方类,这些类可能不一定在同一个包中,您也可以选择不使用类而不必删除它。