Haxe 从包中获取所有类
我想用一种(独立于平台的)方式列出一个包中的所有类Haxe 从包中获取所有类,haxe,Haxe,我想用一种(独立于平台的)方式列出一个包中的所有类 一种可能的方法是获取Haxe已知的所有类的列表,然后对其进行筛选。这是存储和检索信息的一种方法: 除此之外,您还可以使用haxe-xml获取所需的类型信息,然后根据需要对其进行转换(使用haxe.rtti中的解析器处理数据),并将JSON编码的结果嵌入-resource theinfo.JSON(通过haxe.resource访问) 顺便说一句:如果不进行任何自动化,只需手动将类添加到数组中,可能会更好。假设您有somepackage.Clas
一种可能的方法是获取Haxe已知的所有类的列表,然后对其进行筛选。这是存储和检索信息的一种方法: 除此之外,您还可以使用
haxe-xml
获取所需的类型信息,然后根据需要对其进行转换(使用haxe.rtti
中的解析器处理数据),并将JSON编码的结果嵌入-resource theinfo.JSON
(通过haxe.resource
访问)
顺便说一句:如果不进行任何自动化,只需手动将类添加到数组中,可能会更好。假设您有somepackage.ClassA
,somepackage.ClassB
。。。那你就可以了
import somepackage.*;
//...
static var CLASSES:Array<Class<Dynamic>> = [ClassA, ClassB, ...];
importsomepackage.*;
//...
静态变量类:数组=[ClassA,ClassB,…];
它为您提供了更大的灵活性,无论您想做什么,您都可以添加第三方类,它们可能不一定在同一个包中,您也可以选择不使用类而不必删除它。我制作了一个宏来帮助您完成这项工作。它在哈希里布 然后将其添加到构建(hxml文件): 然后使用它导入您的类:
// 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
是一个宏,它的作用是:
- 等待编译完成,我们知道应用程序中的所有类型/类
- 检查每一个,看看它是否在指定的包中
- 另请参见它是否扩展(或实现)指定的类/接口
- 如果有,请将类名添加到
文件上的一些特殊元数据-CompileTimeClassList
元数据,其中包含所有匹配类的名称@classlist(…)
- 在运行时,使用元数据以及
创建所有匹配类型的列表Type.resolveClass(…)
ClassList.all_classes.filter(~/^mypackage\./.match)
就可以了。正如你自己所说,这是一种方法。杰森的解决方案基本上就是这样运作的。如果该API方便,请使用它。如果没有,请以我的示例为基础构建您自己的示例。您的示例中的ClassList
到底是什么?@vbence:愚蠢的问题,但您是否打开了我在本文中提供的第一个链接?它有定义ClassList
的代码(除其他外)。我做了一个小改动:在列表中使用完全限定的类名非常有趣的项目。我有点困惑,这些示例是在编译时运行(我只能在构建宏中使用)还是在运行时运行?还有。。。m.classlist
(在CompileTimeClassList.hx中使用)是否记录在某个地方?@vbence,它们在编译时运行。在编译时,它查看包/类,一旦您的所有代码都准备好生成,它就会找到匹配的类,并添加一些元数据,以便我们可以在运行时找到它们。因此有少量的运行时处理,但主要发生在编译时。@v在m
中,有CompileTimeClassList
类上的元数据m.classLists
正在获取宏创建的@classLists(…)
元数据,其中包含所有相关类的名称。我没有关于元数据确切结构的任何进一步文档,但如果您好奇,可以在中添加一个trace()
:)
for ( testClass in testcases ) {
var test = Type.createInstance( testClass, [] );
}
CompileTime.importPackage( "mygame.levels" );
CompileTime.getAllClasses( "mygame.levels", GameLevel );