2013-10-20 2 views
1

리플렉션을 사용하는 Dart에서 엔티티 관리자를 만들려고합니다. 방법은 getById (String id, String returnClass) 메서드는 _get [returnClass] ById (String id) 메서드를 호출합니다.Reflection : LibraryMirror에 함수가 없습니다.

이렇게하려면 dart : mirrors를 사용하고 있으며 엔티티 관리자 개체에 이러한 메서드가 있는지 확인한 다음 호출 해보십시오. 불행히도 LibraryMirror에는 함수가 없습니다.

class EntityMgr { 

    Object getById(String id, String returnClass) { 
    InstanceMirror result = null; 
    String methodName = '_get'+returnClass+'ById'; 

    // Check if a method '_get[returnClass]Byid exists and call it with given ID 
    if(_existsFunction(methodName)) { 
     Symbol symbol = new Symbol(methodName); 
     List methodParameters = new List(); 
      methodParameters.add(id); 

     result = currentMirrorSystem().isolate.rootLibrary.invoke(symbol, methodParameters); 
    } 

    return result; 
    } 

    Product _getProductById(String id) { 
    return new Product(); 
    } 

    bool _existsFunction(String functionName) { 
    return currentMirrorSystem().isolate.rootLibrary.functions.containsKey(functionName); 
    } 
} 

답변

1

거울 라이브러리는이 응답 이후 크게 변화하고 더 이상했다 동시 프로그래밍이고, 당신은 아마 어떤 균주가 실행하지 않아도이 답변

분리의에서 언급 된 API를 반영한다. 보려는 곳은 currentMirrorSystem().libraries이거나 currentMirrorSystem().findLibrary(new Symbol('library_name'))을 사용할 수 있습니다.

동일한 Symbol을 가진 기능이나 클래스가 다른 라이브러리에 있지만 완전히 다른 서명을 가질 수 있기 때문에 라이브러리를 알아야합니다.

how to invoke class form dart library string or file은 라이브러리 및 클래스 이름에서 클래스 미러를 가져 오는 방법을 보여줍니다.

ClassMirror에는 메소드, getter 및 setter가 있습니다. 미러 메소드에는 getter 또는 setter가 포함되어 있지 않습니다.

final Map<Symbol, MethodMirror> methods 
final Map<Symbol, MethodMirror> getters 
final Map<Symbol, MethodMirror> setters 

말했다되고, 당신은 이미 정확하게 당신이하려는 할 수 무엇 때문에 http://api.dartlang.org/docs/bleeding_edge/serialization.html에서 다트 직렬화를 확인 할 수 있습니다.