获取所有具有注释的类的 ClassMirror 实例

FPG*_*PGA 2 dart dart-mirrors

我有这个注释

class Target{
  final String value;
  const Target(this.value);
}
Run Code Online (Sandbox Code Playgroud)

和 2 个用它注释的类

@Target("/313")
class c1{

}

@Target("/314")
class c2{

}
Run Code Online (Sandbox Code Playgroud)

ClassMirror我如何获取具有 Target 注释的类的实例列表?

基于所选的答案,即如果我知道我的课程存在于哪个图书馆

  var mirrorSystem = currentMirrorSystem();
  var libraryMirror = mirrorSystem.findLibrary(#testlib);
  for(ClassMirror classMirror in libraryMirror.declarations.values){
    if(classMirror.metadata!=null){
      for(var meta in classMirror.metadata){
            if(meta.type == reflectClass(Path)){
              print(classMirror.simpleName);
              print(meta.getField(#value));
            }
          }
    }
  }
Run Code Online (Sandbox Code Playgroud)

Gün*_*uer 5

这将在当前隔离中的所有库中搜索带有注释的类@Target('/313')

@MirrorsUsed(metaTargets: Target) // might be necessary when you build this code to JavaScript
import 'dart:mirrors';

class Target {
  final String id;
  const Target(this.id);
}

@Target('/313')
class c1{

}

@Target('/314')
class c2{

}

@Target('/313')
@Target('/314')
class c3{

}

void main() {
  MirrorSystem mirrorSystem = currentMirrorSystem();
  mirrorSystem.libraries.forEach((lk, l) {
    l.declarations.forEach((dk, d) {
      if(d is ClassMirror) {
        ClassMirror cm = d as ClassMirror;
        cm.metadata.forEach((md) {
          InstanceMirror metadata = md as InstanceMirror;
          if(metadata.type == reflectClass(Target) && metadata.getField(#id).reflectee == '/313') {
            print('found: ${cm.simpleName}');
          }
        });
      }
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

找到:符号(“c3”)
找到:符号(“c1”)

  • @GünterZöchbauer 我不确定,但我记得有一次 dart2js 抱怨它必须导出 500+(东西),如果我想让它变得更好,那么我应该添加这个注释,它有帮助(它导出了更少的东西) (2认同)
  • 如果发现 `import 'dart:mirrors';` 树摇动会保留所有类/成员,因为没有 `MirrorsUsed` 提供附加信息。我认为如果您使用反射代码访问其他库中的类,事情会变得很棘手。然后它可能会保留导入“dart:mirrors”的库中的所有信息,但会删除所有不导入“dart:mirrors”的库中的所有信息(当没有另外引用时)。这可能会导致您的反射代码访问在构建为 JS 时可能不再可用的类。 (2认同)
  • @GünterZöchbauer,但我认为镜像没有问题,我正在java中做类似JAX-RS的事情,这样我就可以使用注释构建一个安静的服务,镜像仅在初始化时使用,之后所有内容都被映射,所以它全部在服务器端,如据我所知,dart 镜像的唯一问题是 dart2js (2认同)
  • @FPGA 很抱歉在这次讨论中滥用了你的问题。这仅与 dart2js 有关,但与服务器端代码无关(但可能在将来,当 dart2dart 用于部署服务器端代码时 - 我不知道这是否是计划中的)。 (2认同)