Dart汇总请点击这里
在Dart中,symbol用来反射库中的元数据
使用反射
新建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;
}