在Dart,符号基本上是标识符或运算符的对象表示。 dart中的符号是不透明的动态字符串名称,无法更改并在整个编译期间保持不变。它可用于反映类型的元数据,例如库或类。它们通常用于创建API,并建立一个字符串,它是可以理解的人类和计算机能够使用的字符串之间的关系。
符号可用于获取有关类型(库、类等)的各种信息,例如实例方法列表、构造函数等。
创建符号
可以通过两种不同的方式创建符号 –
1. 向标识符添加哈希 (#) 符号会将其转换为符号
print(#mysymbol);
输出:
Symbol("mysymbol")
2. 否则,可以使用 Class 构造函数显式创建符号。
Symbol mySymbol = Symbol('mysymbol');
print(mySymbol);
输出:
Symbol("mysymbol")
例子:
在本例中,我们将创建一个自定义库,然后使用符号显示其元数据。
在这里,我们首先创建了一个Dart文件自定义。 dart包含一个库custom_lib ,它由一个名为CustomClass的类组成,该类具有方法customFunction1和customFunction2 。
Dart
library custom_lib;
class CustomClass {
void customFunction1() {
print("Custom Function 1");
}
void customFunction2() {
print("Custom Function 2");
}
}
Dart
import 'dart:core';
import 'dart:mirrors';
import 'Custom.dart';
void main() {
// Create symbols for library and class
Symbol libraryName = Symbol('custom_lib');
Symbol className = Symbol('CustomClass');
// Init mirror system
MirrorSystem mirrorSystem = currentMirrorSystem();
LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName);
ClassMirror classMirror = libMirror.declarations[className];
// Get and print methods
final methods = classMirror.instanceMembers;
print('Total number of methods = ${methods.length}');
methods.forEach((symbol, method) {
print(symbol);
});
}
接下来,我们将创建主。 dart文件,该文件将导入dart文件。 dart文件以及其他一些库,例如dart:core和dart:mirror
- 首先,我们将创建 2 个符号。一个用于自定义库,另一个用于自定义类。
- 接下来,我们必须初始化镜像系统,并创建对custom_lib库的镜像引用,然后使用它对我们的 CustomClass 类进行引用。
- 使用classMirror ,我们现在可以提取一些数据,即我们类中存在的方法列表。包括 –
- 用户创建的方法,例如 customFunction1
- 内置方法,例如toString
Dart
import 'dart:core';
import 'dart:mirrors';
import 'Custom.dart';
void main() {
// Create symbols for library and class
Symbol libraryName = Symbol('custom_lib');
Symbol className = Symbol('CustomClass');
// Init mirror system
MirrorSystem mirrorSystem = currentMirrorSystem();
LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName);
ClassMirror classMirror = libMirror.declarations[className];
// Get and print methods
final methods = classMirror.instanceMembers;
print('Total number of methods = ${methods.length}');
methods.forEach((symbol, method) {
print(symbol);
});
}
输出:
Total number of methods = 7
Symbol("==")
Symbol("hashCode")
Symbol("toString")
Symbol("noSuchMethod")
Symbol("runtimeType")
Symbol("customFunction1")
Symbol("customFunction2")