从包中获取所有类

vbe*_*nce 6 haxe

我想要一种(平台无关的)方法来列出包中的所有类.

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

Jas*_*eil 5

我做了一个宏来帮助解决这个问题。它在编译时的 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(...)以创建所有匹配类型的列表。


bac*_*dos 4

这是存储和检索信息的一种方法: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)

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