2017-11-07 1 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를 사용할 수 있습니다.

complete example

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

그냥 죽은 코드 Climination (DCE)에 의해 제거되는 것을 사용하지 않는 필드를 방지하기 위해 @:keep을 추가해야합니다.