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')); //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;
}
来源:CSDN
作者:阿拉阿伯
链接:https://blog.csdn.net/rd_w_csdn/article/details/103926354