本节目标
- 了解内置注解
deprecated
override
- 自定义注解,并使用反射实现
环境
作用
官方称之为 元数据
, 其实在 java
里就是注解
简化代码编写,方便阅读,和重用
内置 deprecated
用来注解 不建议使用、老旧的 成员对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Television {
@deprecated void activate() { turnOn(); }
void turnOn() { print('on!'); } }
main(List<String> args) { var t = new Television(); t.activate(); t.turnOn(); }
|
内置 override
表明你的函数是想覆写超类的一个函数
超类就是被你集成的父类
下面的代码中父类是 Object
1 2 3 4 5 6 7 8 9 10 11
| class A { @override noSuchMethod(Invocation mirror) { print('没有找到方法'); } }
main(List<String> args) { dynamic a = new A(); a.message(); }
|
内置 proxy
注解来避免警告信息
在 Dart2 中已经被标记为过时老旧
1 2 3 4 5 6 7 8 9 10 11
| @proxy class A { noSuchMethod(Invocation mirror) { print('没有找到方法'); } }
main(List<String> args) { dynamic a = new A(); a.say(); }
|
自定义注解
使用反射可以在运行时获取元数据信息
比如服务端的控制器开发
下面的代码 展示了如何在反射中读取 metadata
信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import 'dart:mirrors';
@Todo('seth', 'make this do something') void doSomething() { print('do something'); }
class Todo { final String who; final String what;
const Todo(this.who, this.what); }
main(List<String> args) { currentMirrorSystem().libraries.forEach((uri, lib) { lib.declarations.forEach((s, decl) { decl.metadata.where((m) => m.reflectee is Todo).forEach((m) { var anno = m.reflectee as Todo; if (decl is MethodMirror) { print('Todo(${anno.who}, ${anno.what})'); ((decl as MethodMirror).owner as LibraryMirror).invoke(s, []); } ; }); }); }); }
|
代码
参考
© 猫哥
https://ducafecat.tech
邮箱 ducafecat@gmail.com / 微信 ducafecat / 留言板 disqus