Refer classes by their metadata tag

前端 未结 1 1442
再見小時候
再見小時候 2020-12-04 03:42

Is it possible to find(probably with the mirror API) all classes(in my project) with some metadata annotation?

Example:



        
相关标签:
1条回答
  • 2020-12-04 03:59

    I have found the answer:

    getClassMirrorsByTag.dart

    library impl;
    @MirrorsUsed(metaTargets: Tag)
    import 'dart:mirrors';
    
    class Tag {
      final Symbol name;
      const Tag(this.name);
    }
    List<ClassMirror> getClassMirrorsByTag(Symbol name) {
      List<ClassMirror> res = new List<ClassMirror>();
      MirrorSystem ms = currentMirrorSystem();
      ms.libraries.forEach((u, lm) {
        lm.declarations.forEach((s, dm) {
          dm.metadata.forEach((im) {
            if ((im.reflectee is Tag) && im.reflectee.name == name) {
              res.add(dm);
            }
          });
        });
      });
      return res;
    }
    

    extra.dart

    library extra;
    import 'getClassMirrorsByTag.dart';
    
    @Tag(#foo)
    class C {}
    

    main.dart

    library  main;
    import 'getClassMirrorsByTag.dart';
    import 'extra.dart';
    @Tag(#foo)
    class A{}
    @Tag(#baz)
    class B{}
    
    
    void main() {
      print(getClassMirrorsByTag(#foo));
    }
    

    output:

    [ClassMirror on 'A', ClassMirror on 'C']

    0 讨论(0)
提交回复
热议问题