Сравнение объекта отражения метаданных Dart @override с экземпляром _Override

#dart #reflection #annotations #overriding #metadata

#dart #отражение #примечания #переопределение #метаданные

Вопрос:

Я пытаюсь привести пример того, как мы могли бы искать аннотацию метаданных @override, используя отражение в Dart.

В примерах, которые я использовал для изучения библиотеки dart: mirrors и reflection, они всегда искали пользовательские аннотации.

Вот пример, в котором они ищут пользовательскую аннотацию «Todo»

При поиске пользовательских аннотаций они просто сравнивают объект отражения метаданных с типом данных класса, чтобы проверить соответствие.

В документации Dart, приведенной ниже, вы можете увидеть пример реализации экземпляра _Override.

Вот документация Dart по константе переопределения

Это привело меня к тому, чтобы попробовать:

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

Но «_Override» не может быть разрешен и не предполагает импорта для доступа к такому экземпляру данных.

Я могу использовать объект отражения для сравнения, но я чувствую, что это грязное решение:

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

При использовании аннотации @override я изо всех сил пытаюсь найти способ сравнить объект отражения метаданных с типом экземпляра _Override .

Вот класс собак:

 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'
  

Ответ №1:

Используйте:

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

или

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

Константы Dart канонизированы, и override объект (экземпляр частного _Override класса) не переопределяет operator== from Object , поэтому два выражения выполняют одно и то же.

Для классов аннотаций, в которых есть данные, вы не знаете точный экземпляр, поэтому вам нужно выполнить проверки типов. Для таких аннотаций маркеров, как override , которые имеют только один экземпляр, вы можете сравнить с точным экземпляром константы, используемым для аннотирования.