#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
, которые имеют только один экземпляр, вы можете сравнить с точным экземпляром константы, используемым для аннотирования.