Dart 反射基础实例
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}
运行结果
1类
2属性
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