Symbol是一种用于存储人类可读字符串和经过优化以供计算机使用的字符串之间的关系的方法。
Symbol obj=new Symbol('name');
name必须是有效的公共Dart成员名称,公共构造函数名称或库名称。
考虑以下示例,该代码在库 foo_lib 中声明了一个 Foo 类,该类定义方法 m1,m2,和 m3 。
library foo_lib; //库名可以是一个符号 class Foo { //类名可以是一个符号 m1() { //方法名称可以是一个符号 print("Inside m1"); } m2() { print("Inside m2"); } m3() { print("Inside m3"); } }
以下代码在Symbol类型的帮助下加载Foo.dart库并搜索Foo类, 由于我们反映了上述库中的元数据,因此代码将导入dart:mirrors库。
import 'dart:core'; import 'dart:mirrors'; import 'Foo.dart'; main() { Symbol lib=new Symbol("foo_lib"); //库名称存储为符号 Symbol clsToSearch=new Symbol("Foo"); //类名存储为 Symbol if(checkIf_classAvailableInlibrary(lib, clsToSearch)) //在 foo_lib 库中搜索 Foo 类 print("class found.."); } bool checkIf_classAvailableInlibrary(Symbol libraryName, Symbol className) { MirrorSystem mirrorSystem=currentMirrorSystem(); LibraryMirror libMirror=mirrorSystem.findLibrary(libraryName); if (libMirror != null) { print("Found Library"); print("checkng...class details.."); print("No of classes found is : ${libMirror.declarations.length}"); libMirror.declarations.forEach((s, d) => print(s)); if (libMirror.declarations.containsKey(className)) return true; return false; } }
注意,行libMirror.declarations.forEach((s,d)=> print(s)); 将在运行时遍历库中的每个声明,并将声明打印为Symbol类型。
此代码应产生以下输出-
Found Library checkng...class details.. No of classes found is : 1 Symbol("Foo") //类名显示为符号类型 class found.
现在让我们考虑显示一个类中方法的数量。预定义的类 ClassMirror 可帮助我们实现相同的目的。
import 'dart:core'; import 'dart:mirrors'; import 'Foo.dart'; main() { Symbol lib=new Symbol("foo_lib"); Symbol clsToSearch=new Symbol("Foo"); reflect_InstanceMethods(lib, clsToSearch); } void reflect_InstanceMethods(Symbol libraryName, Symbol className) { MirrorSystem mirrorSystem=currentMirrorSystem(); LibraryMirror libMirror=mirrorSystem.findLibrary(libraryName); if (libMirror != null) { print("Found Library"); print("checkng...class details.."); print("No of classes found is : ${libMirror.declarations.length}"); libMirror.declarations.forEach((s, d) => print(s)); if (libMirror.declarations.containsKey(className)) print("found class"); ClassMirror classMirror=libMirror.declarations[className]; print("No of instance methods found is ${classMirror.instanceMembers.length}"); classMirror.instanceMembers.forEach((s, v) => print(s)); } }
此代码应产生以下输出-
Found Library checkng...class details.. No of classes found is : 1 Symbol("Foo") found class No of instance methods found is 8 Symbol("==") Symbol("hashCode") Symbol("toString") Symbol("noSuchMethod") Symbol("runtimeType") Symbol("m1") Symbol("m2") Symbol("m3")
您可以使用 MirrorSystem 类将存储在Symbol中的类或库之类的类型名称转换回字符串,以下代码显示了如何将Symbol转换为字符串。
import 'dart:mirrors'; void main(){ Symbol lib=new Symbol("foo_lib"); String name_of_lib=MirrorSystem.getName(lib); print(lib); print(name_of_lib); }
它应该产生以下输出-
Symbol("foo_lib") foo_lib
参考链接
https://www.learnfk.com/dart-programming/dart-programming-symbol.html
标签:Foo,lib,Symbol,无涯,Dart,print,dart,libMirror From: https://blog.51cto.com/u_14033984/8330791