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(…)
    创建所有匹配类型的列表

谢谢,但关键是要给API提供一种方便的方法,一种简写方法,而不是列出一个包的所有类。那么,你只需进入
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 );