Dart 反射

江枫思渺然 提交于 2020-01-14 00:52:16

Dart汇总请点击这里

在Dart中,symbol用来反射库中的元数据
mirror

使用反射

新建Animal.dart,输入以下内容:

library animal_lib;   

class Animal {         
  walk() {        
    print('animals can walk'); 
  } 
  sleep() { 
    print('animals need to sleep'); 
  } 
  eat() { 
    print('animals need to eat'); 
  } 
}

class Person extends Animal{
  work() {
    print('a person need to work for money');
  }
}

新建AnimalSymbol.dart,输入以下内容:

import 'dart:core'; 
import 'dart:mirrors'; 
import 'Animal.dart';  

main() { 
  Symbol lib = new Symbol('animal_lib');   
  Symbol className = new Symbol('Animal');  
  // 像是上面的编译时常量也可以写成:Symbol className = #Animal;
  // print(#s == new Symbol('s')); //true
  testSymbolReflect(lib, className);
}

void testSymbolReflect(Symbol lib, Symbol className) { 
  MirrorSystem mirrorSystem = currentMirrorSystem(); 
  LibraryMirror libMirror = mirrorSystem.findLibrary(lib); 
  
  if (libMirror != null) { 
    print('there are ${libMirror.declarations.length} classes found in the library:'); 
    // 获取库中所有的类
    libMirror.declarations.forEach((s, d) => print(s));  
    // containsKey用来判断库中是否存在某一个类
    if (libMirror.declarations.containsKey(className)) print('found class');
    // 获取一个指定类的反射
    ClassMirror classMirror = libMirror.declarations[className]; 
    print('there are ${classMirror.instanceMembers.length} instance methods in the ${MirrorSystem.getName(className)}: ');
    // 获取该类中所有的实例方法
    classMirror.instanceMembers.forEach((s, v) => print(MirrorSystem.getName(s))); 
  }
}

执行dart AnimalSymbol.dart,输出结果:
在这里插入图片描述

Dart mirror 家族

ClassMirror反映了Dart语言类。.
ClosureMirror反映了一个闭包. […]
CombinatorMirror在库依赖项上声明的show / hide组合的镜像。
Comment用于将注释编码为元数据注解的类。
DeclarationMirror反映了Dart程序中声明的某个实体.
FunctionTypeMirror表示Dart语言中函数的类型.
InstanceMirror反映Dart语言对象的实例.
IsolateMirror反映了隔离.
LibraryDependencyMirror导入或导出声明中的镜像.
LibraryMirror反映了Dart语言库,提供对库的变量,函数和类的访问.
MethodMirror反映Dart语言函数,方法,构造函数,getter或setter.
Mirror 反映了一些Dart语言实体. […]
MirrorsUsed描述如何使用“dart:mirrors”的注解(实验). […]
MirrorSystem是用于反映一组关联库的主要接口. […]
ObjectMirror 是InstanceMirror, ClassMirror, 和 LibraryMirror的公共超接口,表示它们的共享功能. […]
ParameterMirror反映Dart形式参数声明.
SourceLocation描述Dart源代码中实体的范围.
TypedefMirror表示Dart语言程序中的typedef.
TypeMirror反映Dart语言类,typedef,函数类型或类型变量.
TypeVariableMirror表示泛型类型的类型参数.
VariableMirror反映了Dart语言变量声明.

Functions
currentMirrorSystem() → MirrorSystem
返回当前隔离的MirrorSystem.
reflect(Object reflectee) → InstanceMirror
反映一个实例. […]
reflectClass(Type key) → ClassMirror
反映类声明. […]
reflectType(Type key, [ List typeArguments ]) → TypeMirror
反映key表示的类型. […]

反射分析

反射类

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的子类
}

反射方法

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);
}

反射声明

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; //元数据列表
}

反射对象

abstract class InstanceMirror implements ObjectMirror {
 
  ClassMirror get type;  //类型

  bool get hasReflectee;

  get reflectee;//反射一个实体对象(hasReflectee==false,抛异常)

  bool operator ==(other);
}

反射属性

variableMirror 类属性或顶级属性

  • isStatic 静态
  • isFinal
  • isConst
  • type 返回类型反射TypeMirror

ParameterMirror 函数的参数

  • isOptional 可选位置参数([])
  • isNamed 可选命名参数({})
  • hasDefaultValue 是否有默认值
  • defaultValue 获取默认值对象反射

反射类型

TypeMirror 比如:List

  • reflectedType 类型 List
  • typeVariables 类型变量集合 , E( List中类型变量是E )
  • typeArguments 类型集合 , int
    TypedefMirror

TypeVariableMirror 代指泛型的类型变量(如: T)

  • upperBound 上界 , T extends M ,返回 M
  • isStatic

TypedefMirror 类型别名

  • referent 返回函数类型反射FunctionTypeMirror

FunctionTypeMirror 函数类型反射

//typedef A<T> = int Function(T a, T b);
abstract class FunctionTypeMirror implements ClassMirror {
  
  TypeMirror get returnType;  //返回类型反射 int

  List<ParameterMirror> get parameters; // 参数反射集合

  MethodMirror get callMethod;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!