2013-02-23 1 views
2

거울을 선물로 반환하면 극적으로 할 수있는 일이 제한됩니다. 예를 들어다트 미러 API : 리플렉션 통화 결과 얻기

,

class ObjectA { 
    methodA(){} 
    methodB(){} 
} 

class DynamicWrapper extends MagicalDynamicWrapper { 
    ObjectA real; 
    Map<String, Function> methods; 
    DynamicWrapper(this.real, this.methods); 
} 

var w = new DynamicWrapper(new ObjectA(), {"methodB" :(){ 'do something' }}); 
w.methodA() // calls ObjectA.methodA 
w.methodB() // calls 'do something' 

가 MagicalDynamicWrapper에 noSuchMethod을 정의하는 것입니다 내가 일반적으로 할 거라고 방법 : 방법에 같은 이름을 가진 방법이 있는지 확인합니다

  • 지도를 작성한 다음 호출하십시오.
  • 이 없으면 리플렉션을 통해 "실제"개체를 호출합니다.

실제 개체를 호출하면 항상 미래가 표시됩니다. 그래서 그것은 작동하지 않습니다.

어떤 시점에서 Getter 값을 사용하여 미래의 값을 가져올 수 있지만 더 이상 사용할 수 없습니다.

내 질문 :

동 기적으로 반사 호출의 결과를 얻을 수있는 방법이 있나요?

분산 된 환경에서 선물은 분명히 갈 수 있습니다. 그러나 모든 메타 정보를 사용할 수있는 비 분산 설정에서는 리플렉션 호출의 가치를 얻을 수 있어야합니다. 필자는 테스트 프레임 워크의 작성자와 도구를 작성하는 데 큰 차이가 있습니다. 미래를 반환

답변

2

갖는 거울은 확실히 (:-) 아니라, 적어도 나에게)

없음은하지 않습니다 감각을합니다. 그리고 아마, http://dartbug.com/4633#c17

방법지도에 같은 이름을 가진 방법이 있는지 확인한다이 MagicalDynamicWrapper에 noSuchMethod을 정의하는 것입니다 내가 일반적으로 할 거라고하는 방법은 다음 전화를 참조 변경됩니다 아무 것도 없으면 리플렉션을 통해 "실제"오브젝트를 호출합니다.

InvocationMirror 설명서를 확인하십시오.

class Proxy { 
    var target; 
    Map<String, Function> overrides; 

    Proxy(this.target, this.overrides); 

    noSuchMethod(invocation) { 
    if (overrides.containsKey(invocation.memberName)) { 
     return overrides[invocation.memberName](); 
    } else { 
     return invocation.invokeOn(target); 
    } 
    } 
} 

동 기적으로 반사 호출의 결과를 얻을 수있는 방법이 있나요 : 당신은 invokeOn 방법을 사용하여 메서드 호출을 전달할 수 있습니다?

아니요, 아닙니다. 지금 말고. 원하는 경우 http://dartbug.com/4633에 별표를 표시 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 내 경우에는 invokeOn 메서드가 작동합니다. 곧 동기화 리플렉션 API가 추가되기를 바랍니다. 필자가 쓰는 것으로 생각하는 모든 재미있는 라이브러리가 필요하기 때문이다. –

1

당분간 deprecatedFutureValue (aFuture)를 사용할 수 있습니다. 분명히 그 이름으로 그들은 그것의 사용을 방해하고 결국 사라질 것이지만 나는 동기식 거울 API를 얻을 때까지 절대적으로 이와 같은 것을 필요로한다는 것에 동의한다.

+0

deprecatedFutureValue가 작동합니다. 감사. –