将 Dart @override 元数据反射器与 _Override 的实例进行比较

Compare Dart @override Metadata Reflectee to Instance of _Override

我想举一个例子来说明我们如何在 Dart 中使用反射来搜索 @override 元数据注释。

在我用来学习 dart:mirrors 库和反射的示例中,它们总是在搜索自定义注释。

Here is an example where they search for a custom "Todo" annotation

在搜索自定义注释时,他们只需将元数据的反射体与 class 数据类型进行比较以检查是否匹配。

在下面链接的 Dart 文档中,您可以看到 _Override 实例的示例实现。

Here is Dart documentation on the override constant

这促使我尝试:

if(meta.reflectee is _Override) {
    print('Found!);
}

但是无法解析“_Override”,建议不要导入来访问此类数据实例。

我可以将反射对象串起来进行比较,但我觉得这是一个肮脏的解决方案:

if (meta.reflectee.toString() == "Instance of '_Override'") {
    print('Found!');
}

使用@override 注释时,我正在努力寻找一种方法将元数据的反射对象与 _Override 的实例类型进行比较。

这是狗 class:

class Dog extends Animal {
  Dog(String name) : super(name);

  @override
  void makeNoise() {
    print('Bark, bark!');
  }
}

这是我的反射搜索代码:

 Dog dog = Dog('Harper');

  InstanceMirror instanceMirror = reflect(dog);
  ClassMirror classMirror = instanceMirror.type;

  classMirror.instanceMembers.forEach((_, member) {

    print(member.owner.simpleName);
    print(member.simpleName);
    print(member.isRegularMethod);

    member.metadata.forEach((meta) {
      print(meta.reflectee);
      if (meta.reflectee is _Override) {
        print('Found!');
      }
      
    });
  });

最后,这是 instanceMembers.forEach 循环到达我感兴趣的方法时的输出:

Symbol("Dog")
Symbol("makeNoise")
true
Instance of '_Override'

使用:

if (meta.reflectee == override) {
  print('Found!);
}

if (identical(meta.reflectee, override)) {
  print('Found!);
}

Dart 常量已规范化,override 对象(私有 _Override class 的实例)不会覆盖 Object 中的 operator==,所以这两个表达式做同样的事情。

对于有数据的注解classes,你不知道确切的实例,所以你必须做类型检查。对于像 override 这样只有一个实例的标记注释,您可以与用于注释的确切常量实例进行比较。