我做了一个宏来帮助解决这个问题。它在编译时的 haxelib中。
haxelib install compiletime
Run Code Online (Sandbox Code Playgroud)
然后将其添加到您的构建(hxml文件)中:
-lib compiletime
Run Code Online (Sandbox Code Playgroud)
然后使用它导入您的类:
// 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);
Run Code Online (Sandbox Code Playgroud)
然后您可以遍历它们:
for ( testClass in testcases ) {
var test = Type.createInstance( testClass, [] );
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您的代码中从未包含“ import some.package.SomeClass”,则由于消除了无效代码,因此将不会包含该类。因此,即使您不想在代码中显式调用它,也要确保将其包括在内,可以执行以下操作:
CompileTime.importPackage( "mygame.levels" );
CompileTime.getAllClasses( "mygame.levels", GameLevel );
Run Code Online (Sandbox Code Playgroud)
怎么运行的
CompileTime.getAllClasses 是一个宏,它的作用是:
@classLists(...)上的元数据CompileTimeClassList,其中包含所有匹配类的名称。Type.resolveClass(...)以创建所有匹配类型的列表。这是存储和检索信息的一种方法:https://gist.github.com/back2dos/c9410ed3ed476ecc1007
除此之外,您还可以使用haxe -xml它来获取所需的类型信息,然后根据需要对其进行转换(使用解析器来haxe.rtti处理数据)并嵌入 JSON 编码结果-resource theinfo.json(通过访问haxe.Resource)。
附带说明:您可能最好不要进行任何自动化,而只需手动将类添加到数组中。想象一下你有somepackage.ClassA, somepackage.ClassB, ... 那么你可以做
import somepackage.*;
//...
static var CLASSES:Array<Class<Dynamic>> = [ClassA, ClassB, ...];
Run Code Online (Sandbox Code Playgroud)
它为您提供了更大的灵活性,因为无论您想要做什么,您都可以随时添加第三方类,这些类不一定位于同一个包中,您也可以选择不使用类而不必删除它。