2017-11-07 12 views
1

クラスの静的変数には、実行時にその名前を知ることによってどのようにアクセスできますか?クラス名ランタイムから静的変数にアクセスする

親インターフェイスの配列にクラスのインスタンス(静的フィールド '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)); 
     } 
    } 
} 

コード:http://try-haxe.mrcdk.com/#987dA

答えて

2

あなたはまだType.getClassの復帰にReflect.fieldを使用することができます。

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

complete example

ただ、デッドコードClimination(DCE)によって除去されることから、未使用のフィールドを防ぐために@:keepを追加することを忘れないでください。

関連する問題