Macros 从类名运行时访问静态变量

Macros 从类名运行时访问静态变量,macros,haxe,Macros,Haxe,如何在运行时通过知道类的名称来访问它的静态变量 我在父接口数组中存储类的实例(我知道这些类肯定有静态字段“id”)。我可以很容易地在编译时用宏获取“id”,但在运行时很难这样做 import Macro; interface Parent { } class A implements Parent { static public var id = 1; public var myVar: String; public function new(name: Stri

如何在运行时通过知道类的名称来访问它的静态变量

我在父接口数组中存储类的实例(我知道这些类肯定有静态字段“id”)。我可以很容易地在编译时用宏获取“id”,但在运行时很难这样做

import Macro;

interface Parent {

}

class A implements Parent {
    static public var id = 1;
    public var myVar: String;

    public function new(name: String){
        myVar = name;
    }
}


class B implements Parent {
    static public var id = 2;
    public var myVar: String;

    public function new(name: String){
        myVar = name;
    }
}


class Test { 
    static private var components = new Array<Parent>();
    static function main() {
        var a = new A("First.");
        components.push(a);
        components.push(new B("Second."));
        var id = Macro.getId(a);
        trace(id);

        for (c in components) {
            var cc = Type.getClass(c);
            trace(Type.getClassName(cc));
            // TODO: access 'id'
          //trace(Macro.getId(cc));
        }
    }
}
导入宏;
接口父级{
}
类实现父类{
静态公共变量id=1;
公共变量myVar:String;
公共函数新建(名称:字符串){
myVar=名称;
}
}
类实现父类{
静态公共变量id=2;
公共变量myVar:String;
公共函数新建(名称:字符串){
myVar=名称;
}
}
类测试{
静态私有变量组件=新数组();
静态函数main(){
var a=新a(“第一”);
组件。推送(a);
推动(新的B(“第二”);
var id=Macro.getId(a);
痕迹(id);
用于(组件中的c){
var cc=Type.getClass(c);
跟踪(Type.getClassName(cc));
//TODO:访问“id”
//跟踪(Macro.getId(cc));
}
}
}

代码:

在返回
Type.getClass
时,仍然可以使用
Reflect.field

trace(Reflect.field(cc, "id"));

只需记住添加
@:keep
,以防止未使用的字段被死代码删除(DCE)