🍉 加载中...


Dart 反射基础实例

7 minute read

dart 反射基础使用方法演示实例,记录下来留以备用。

实例

 1import 'dart:mirrors';
 2
 3@Todo('类')
 4abstract class TestMixin {
 5  @Todo('属性')
 6  String name;
 7
 8  @Todo('方法')
 9  void getRequest(@Todo('参数') String param);
10}
11
12class Todo {
13  final String name;
14
15  const Todo(this.name);
16}
17
18main(List<String> args) {
19  getWorkAnnotation();
20}
21
22void getWorkAnnotation() {
23  ClassMirror classMirror = reflectClass(TestMixin);
24
25  // 获取 class 上的元数据
26  classMirror.metadata.forEach((metadata) {
27    print(metadata.reflectee?.name);
28  });
29
30  classMirror.declarations.forEach((Symbol key, DeclarationMirror value) {
31    // 获取属性上的元数据
32    if (value is DeclarationMirror) {
33      value.metadata.forEach((metadata) {
34        print(metadata.reflectee?.name);
35      });
36    }
37
38    // 获取方法中参数上的元数据
39    if (value is MethodMirror) {
40      value.metadata.forEach((metadata) {
41        print(metadata.reflectee?.name);
42      });
43      value.parameters.forEach((param) {
44        //if (value.simpleName == #getRequest) {
45        param.metadata.forEach((metadata) {
46          print(metadata.reflectee?.name);
47        });
48        //}
49      });
50    }
51  });
52}

运行结果

12属性
3方法
4方法
5参数

补充

反射类

 1abstract class ClassMirror implements TypeMirror, ObjectMirror {
 2
 3  ClassMirror get superclass;  //父类 , Object的父类为null
 4
 5  List<ClassMirror> get superinterfaces; //接口列表
 6
 7  bool get isAbstract; //是否抽象类
 8
 9  bool get isEnum;     //是否枚举类
10
11  //只包含自己原本的方法(构造方法、setter/getter、普通方法、静态方法)、成员(普通成员、静态成员),不包含继承来的
12  //注意: 属性是VariableMirror,实现了setter/getter的属性为MethodMirror
13  Map<Symbol, DeclarationMirror> get declarations;
14
15  //包含构造方法、setter/getter、普通方法,包含继承来的
16  Map<Symbol, MethodMirror> get instanceMembers;
17
18  //静态方法及静态属性的setter/getter方法,包含继承来的
19  //与instanceMembers合在一起就是类中全部的方法
20  Map<Symbol, MethodMirror> get staticMembers;
21
22  //如果S = A with B ,那么ClassMirror(S).mixin 为 ClassMirror(B),否则返回本身
23  ClassMirror get mixin;
24
25  /**
26   * 调用构造方法
27   * constructorName 构造方法名称(默认构造方法为空字符串,命名构造方法为其命名)
28   * positionalArguments 参数列表
29   */
30  InstanceMirror newInstance(Symbol constructorName, List positionalArguments,
31      [Map<Symbol, dynamic> namedArguments]);
32
33  bool operator ==(other); //判断是否相等
34
35  bool isSubclassOf(ClassMirror other); //判断是不是other的子类
36}
 1abstract class Symbol {
 2  
 3  static const Symbol unaryMinus = const Symbol("unary-");
 4
 5  static const Symbol empty = const Symbol("");
 6
 7  //构造方法,也可使用#来创建
 8  //Symbol("A") == #A
 9  const factory Symbol(String name) = internal.Symbol;
10
11  int get hashCode;
12
13  bool operator ==(other);
14}
15
16/*
17class A { var a = 1;}
18Symbol("A") == #A                //方法、类、参数直接用名字
19Symbol("A.t") == #A.t            //命名构造方法也是直接用名字
20Symbol("a=") == #a=              //属性set方法(私有属性即为#_a=)
21Symbol("a") == #a                //属性get方法
22Symbol("==") == #==              //操作符直接使用符号 
23Symbol("") == Symbol.empty 
24*/

方法反射

 1abstract class MethodMirror implements DeclarationMirror {
 2
 3  TypeMirror get returnType; //反射类型
 4
 5  String get source; //source code , 不可用返回null
 6
 7  List<ParameterMirror> get parameters; //参数列表
 8
 9  bool get isStatic; //是否静态方法
10
11  bool get isAbstract;//是否抽象方法
12
13  bool get isSynthetic;//Synthetic方法(即隐式的setter/getter或构造方法[只定义属性或无构造函数])
14
15  bool get isRegularMethod; //常规方法(即非setter/getter、构造方法)
16
17  bool get isOperator; //操作符方法
18
19  bool get isGetter; //get方法
20
21  bool get isSetter; //set方法
22
23  bool get isConstructor;      //判断是否构造方法
24
25  Symbol get constructorName;   //获得构造方法的名字,默认构造方法为空字符串
26
27  bool get isConstConstructor;   //常量构造方法
28
29  bool get isGenerativeConstructor;
30
31  bool get isRedirectingConstructor;//重定向构造方法
32
33  bool get isFactoryConstructor;  //工厂构造方法
34
35  bool operator ==(other);
36}

属性反射

 1abstract class DeclarationMirror implements Mirror {
 2
 3  Symbol get simpleName; //简称
 4
 5  Symbol get qualifiedName; //全称,包含路径
 6
 7  //库 -> null
 8  //类、顶级函数或变量、typedef -> 库
 9  //S with M -> M
10  //类中的方法、变量 -> 类
11  //函数中的局部变量、函数 -> 函数
12  DeclarationMirror get owner;  //所有者
13
14  bool get isPrivate;  //私有
15
16  bool get isTopLevel;  //顶级
17
18  //格式:dart:core/runtime/libobject_patch.dart:53
19  SourceLocation get location; //来源,标明方法、类、属性所在文件的位置
20
21  List<InstanceMirror> get metadata; //元数据列表
22}

更多参考:www.jianshu.com/p/d68278d19f79