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

实例

 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import 'dart:mirrors';

@Todo('类')
abstract class TestMixin {
  @Todo('属性')
  String name;

  @Todo('方法')
  void getRequest(@Todo('参数') String param);
}

class Todo {
  final String name;

  const Todo(this.name);
}

main(List<String> args) {
  getWorkAnnotation();
}

void getWorkAnnotation() {
  ClassMirror classMirror = reflectClass(TestMixin);

  // 获取 class 上的元数据
  classMirror.metadata.forEach((metadata) {
    print(metadata.reflectee?.name);
  });

  classMirror.declarations.forEach((Symbol key, DeclarationMirror value) {
    // 获取属性上的元数据
    if (value is DeclarationMirror) {
      value.metadata.forEach((metadata) {
        print(metadata.reflectee?.name);
      });
    }

    // 获取方法中参数上的元数据
    if (value is MethodMirror) {
      value.metadata.forEach((metadata) {
        print(metadata.reflectee?.name);
      });
      value.parameters.forEach((param) {
        //if (value.simpleName == #getRequest) {
        param.metadata.forEach((metadata) {
          print(metadata.reflectee?.name);
        });
        //}
      });
    }
  });
}

运行结果

1
2
3
4
5
类
属性
方法
方法
参数

补充

反射类

 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
31
32
33
34
35
36
abstract class ClassMirror implements TypeMirror, ObjectMirror {

  ClassMirror get superclass;  //父类 , Object的父类为null

  List<ClassMirror> get superinterfaces; //接口列表

  bool get isAbstract; //是否抽象类

  bool get isEnum;     //是否枚举类

  //只包含自己原本的方法(构造方法、setter/getter、普通方法、静态方法)、成员(普通成员、静态成员),不包含继承来的
  //注意: 属性是VariableMirror,实现了setter/getter的属性为MethodMirror
  Map<Symbol, DeclarationMirror> get declarations;

  //包含构造方法、setter/getter、普通方法,包含继承来的
  Map<Symbol, MethodMirror> get instanceMembers;

  //静态方法及静态属性的setter/getter方法,包含继承来的
  //与instanceMembers合在一起就是类中全部的方法
  Map<Symbol, MethodMirror> get staticMembers;

  //如果S = A with B ,那么ClassMirror(S).mixin 为 ClassMirror(B),否则返回本身
  ClassMirror get mixin;

  /**
   * 调用构造方法
   * constructorName 构造方法名称(默认构造方法为空字符串,命名构造方法为其命名)
   * positionalArguments 参数列表
   */
  InstanceMirror newInstance(Symbol constructorName, List positionalArguments,
      [Map<Symbol, dynamic> namedArguments]);

  bool operator ==(other); //判断是否相等

  bool isSubclassOf(ClassMirror other); //判断是不是other的子类
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
abstract class Symbol {
  
  static const Symbol unaryMinus = const Symbol("unary-");

  static const Symbol empty = const Symbol("");

  //构造方法,也可使用#来创建
  //Symbol("A") == #A
  const factory Symbol(String name) = internal.Symbol;

  int get hashCode;

  bool operator ==(other);
}

/*
class A { var a = 1;}
Symbol("A") == #A                //方法、类、参数直接用名字
Symbol("A.t") == #A.t            //命名构造方法也是直接用名字
Symbol("a=") == #a=              //属性set方法(私有属性即为#_a=)
Symbol("a") == #a                //属性get方法
Symbol("==") == #==              //操作符直接使用符号 
Symbol("") == Symbol.empty 
*/

方法反射

 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
31
32
33
34
35
36
37
abstract class MethodMirror implements DeclarationMirror {

  TypeMirror get returnType; //反射类型

  String get source; //source code , 不可用返回null

  List<ParameterMirror> get parameters; //参数列表

  bool get isStatic; //是否静态方法

  bool get isAbstract;//是否抽象方法

  bool get isSynthetic;//Synthetic方法(即隐式的setter/getter或构造方法[只定义属性或无构造函数])

  bool get isRegularMethod; //常规方法(即非setter/getter、构造方法)

  bool get isOperator; //操作符方法

  bool get isGetter; //get方法

  bool get isSetter; //set方法

  bool get isConstructor;      //判断是否构造方法

  Symbol get constructorName;   //获得构造方法的名字,默认构造方法为空字符串

  bool get isConstConstructor;   //常量构造方法

  bool get isGenerativeConstructor;

  bool get isRedirectingConstructor;//重定向构造方法

  bool get isFactoryConstructor;  //工厂构造方法

  bool operator ==(other);
}

属性反射

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
abstract class DeclarationMirror implements Mirror {

  Symbol get simpleName; //简称

  Symbol get qualifiedName; //全称,包含路径

  //库 -> null
  //类、顶级函数或变量、typedef -> 库
  //S with M -> M
  //类中的方法、变量 -> 类
  //函数中的局部变量、函数 -> 函数
  DeclarationMirror get owner;  //所有者

  bool get isPrivate;  //私有

  bool get isTopLevel;  //顶级

  //格式:dart:core/runtime/libobject_patch.dart:53
  SourceLocation get location; //来源,标明方法、类、属性所在文件的位置

  List<InstanceMirror> get metadata; //元数据列表
}

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