2016-11-06 5 views
1

제 3 자 lib에서 반사 형을 사용해야하지만 작동하지 않습니다.외부 lib에서 반사 가능한 다트를 사용하십시오

import 'package:library_a/library_a.dart' show reflector; 

@reflector 
class whateverz {} 

이제 응용 프로그램 C 요구 :

class Reflector extends Reflectable { 
    const Reflector() 
     : super(invokingCapability, 
     typeRelationsCapability, 
     metadataCapability, 
     superclassQuantifyCapability, 
     reflectedTypeCapability); 
} 

const Reflector reflector = const Reflector(); 

도서관 B는 반사경 주석되는 클래스가 있습니다

도서관 A는 반사 선언이 있습니다

이 같은 시나리오를 생각해보십시오 라이브러리 B 내에있는 임의의 클래스에서 리플렉션을 사용합니다.

제 문제는 반영 가능한 lib에 주석이 달린 whateverz 클래스를 볼 수 없다는 것입니다. 빌드는 "reflector.dart :이 반사경은 어떤 것과도 일치하지 않습니다"라고 경고합니다.

그리고 "print (reflector.annotatedClasses);" 그것은 콘솔 내에서 []를 인쇄합니다.

이것이 가능합니까? 써드 파티 라이브러리에있는 클래스에 주석을 달아서 리플렉션을 통해 애플리케이션에서 사용하게할까요? 예인 경우 무엇이 잘못 되었나요?

답변

1

변환이 올바른 주 파일에서 수행되지 않는 것 같습니다.

트랜스포머는 프로그램에서 선언을 찾을 수 있으므로 라이브러리 B (라이브러리 A)를 가져 오는 라이브러리가 프로그램에 있으면 트랜스포머가 확실히 미러를 생성 할 수 있어야합니다. class whateverz이고 그 거울은 reflector.annotatedClasses입니다.

그러나 변환 중에 고려되는 파일 집합은 엔트리 포인트 (즉 pubspec.yaml에 지정된 entry_points의 관련 요소)에서 가져 오기를 전이 폐쇄하는 것이므로 입력 지점이 실제 주 파일이 아니라면 트랜스포머는 더 작은 (또는 다른 단지) 라이브러리 세트로 작업 할 수 있습니다. 예를 들어, 라이브러리 A를 엔트리 포인트로 사용하면 변환기는 라이브러리 B가 존재한다는 것을 알지 못합니다 (라이브러리 A가 라이브러리 B를 직접 또는 간접적으로 가져 오지 않는다고 가정 할 때) 변환기는 라이브러리의 선언을 발견하지 못합니다 B와 해당 거울을 얻지 못할 것입니다.

다른 개발자가 가져 와서 사용할 라이브러리에서 작업하는 경우 반영 할 수있는 변환기를 pubspec.yaml에 포함하고 entry_points에 요소를 추가하도록 (또는 해당 개발자가 이미 사용한 와일드 카드를 사용하는지 확인해야합니다. 원하는 모든 진입 점과 일치 함).

three_files_test.dart을 확인하면 한 파일의 반사기가 다른 파일의 클래스에 주석을다는 데 사용되는 작은 예제를 볼 수 있으며 meta_reflectors_test.dart을 확인하면 반사기, 대상 클래스 및 기타 요소를 어떻게 분리 할 수 ​​있는지 확인할 수 있습니다 (예 : GlobalQuantifyCapability을 사용하여 특정 반사경을 대상 클래스가 들어있는 파일을 편집하지 않고 특정 대상 클래스와 연관 시키십시오).