2014-04-04 1 views
1

미러 API가 작동하는 방식을 이해하려고합니다. 특히 을 사용하여 Symbol에서 필드 값을 얻는 방법getField를 통해 미러링을 통해 클래스 변수 값 가져 오기

getField 메서드의 경우 getter 인 Symbol에 해당하며 암시적일 수 있습니다. 따라서 나는 getField이 필드에서 직접 호출 될 수 있다는 것을 이해했습니다. 다음 코드 샘플에서는 ab의 getter를 암시 적으로 정의해야합니다.

그러나 코드는 어떤 게터도 찾을 수 없다는 불평을 던지며 throw합니다. Breaking on exception: object of NoSuchMethodError 및 깨고 :이 작동하려면 명시 적으로 게터를 정의해야 할 잘못된 느낌 native "ClassMirror_invokeGetter";

abstract class CheckInitialized { 
    bool hasNull() { 
    var im = reflect(this); 
    var cm = im.type; 
    cm.declarations.values.where((dm) => dm is VariableMirror) 
     .forEach((vm) { 
     print(cm.getField(vm.simpleName)); 
     }); 
     // If field is null, return true 
     // If no fields are null, return false 
    } 
} 

class Test extends CheckInitialized { 
    int a; 
    String b; 
} 

void main() { 
    var a = new Test(); 
    print(a.hasNull()); // true 
} 

에 '다트 거울 - patch_mirrors_impl.dart', 그러나 이것은 왜 나는 볼 수 없습니다 작동 안함. 물론, mirrors.dart는 여전히 많이 변하고 있기 때문에 v1.2.0에 대한 것임을 암시합니다.

답변

3

getField을 클래스 미러에서 실행하려고합니다. ab은 인스턴스 필드이므로 getField은 실패합니다. abstatic으로 변경하면 getField 호출이 작동합니다.

또는 인스턴스 - 미러 (im)에서 getField을 호출해야합니다.