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));
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">libMirror</span><span class="pun">.</span><span class="pln">declarations</span><span class="pun">.</span><span class="pln">containsKey</span><span class="pun">(</span><span class="pln">className</span><span class="pun">))</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
}
}
注意,行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));
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">libMirror</span><span class="pun">.</span><span class="pln">declarations</span><span class="pun">.</span><span class="pln">containsKey</span><span class="pun">(</span><span class="pln">className</span><span class="pun">))</span><span class="pln"> </span><span class="kwd">print</span><span class="pun">(</span><span class="str">"found class"</span><span class="pun">);</span><span class="pln">
</span><span class="typ">ClassMirror</span><span class="pln"> classMirror</span><span class="pun">=</span><span class="pln">libMirror</span><span class="pun">.</span><span class="pln">declarations</span><span class="pun">[</span><span class="pln">className</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"No of instance methods found is ${classMirror.instanceMembers.length}"</span><span class="pun">);</span><span class="pln">
classMirror</span><span class="pun">.</span><span class="pln">instanceMembers</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">((</span><span class="pln">s</span><span class="pun">,</span><span class="pln"> v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=></span><span class="pln"> </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">s</span><span class="pun">));</span><span class="pln">
}
}
此代码应产生以下输出-
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