【发布时间】:2020-11-10 14:37:51
【问题描述】:
我正在尝试提出一个示例,说明如何使用 Dart 中的反射搜索 @override 元数据注释。
在我用来学习 dart:mirrors 库和反射的示例中,他们总是在搜索自定义注释。
Here is an example where they search for a custom "Todo" annotation
在搜索自定义注释时,他们只需将元数据的反射对象与类数据类型进行比较以检查是否匹配。
在下面链接的 Dart 文档中,您可以看到 _Override 实例的示例实现。
Here is Dart documentation on the override constant
这导致我尝试:
if(meta.reflectee is _Override) {
print('Found!);
}
但“_Override”无法解析,并建议没有导入来访问此类数据实例。
我可以 toString 反射器进行比较,但我觉得这是一个肮脏的解决方案:
if (meta.reflectee.toString() == "Instance of '_Override'") {
print('Found!');
}
在使用@override 注释时,我正在努力寻找一种方法将元数据的反射对象与_Override 的实例类型进行比较。
这里是 Dog 类:
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'
【问题讨论】:
标签: dart reflection annotations overriding metadata