当前位置: 代码迷 >> 综合 >> Dart 反射
  详细解决方案

Dart 反射

热度:42   发布时间:2023-12-10 22:02:09.0

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')); //truetestSymbolReflect(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的父类为nullList<ClassMirror> get superinterfaces; //接口列表bool get isAbstract; //是否抽象类bool get isEnum;     //是否枚举类//只包含自己原本的方法(构造方法、setter/getter、普通方法、静态方法)、成员(普通成员、静态成员),不包含继承来的//注意: 属性是VariableMirror,实现了setter/getter的属性为MethodMirrorMap<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 , 不可用返回nullList<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:53SourceLocation 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;  //返回类型反射 intList<ParameterMirror> get parameters; // 参数反射集合MethodMirror get callMethod;
}