📜  Dart– 符号

📅  最后修改于: 2021-09-02 05:19:14             🧑  作者: Mango

在Dart,符号基本上是标识符或运算符的对象表示。 dart中的符号是不透明的动态字符串名称,无法更改并在整个编译期间保持不变。它可用于反映类型的元数据,例如库或类。它们通常用于创建API,并建立一个字符串,它是可以理解的人类和计算机能够使用的字符串之间的关系。

符号可用于获取有关类型(库、类等)的各种信息,例如实例方法列表、构造函数等。

创建符号

可以通过两种不同的方式创建符号 –

1. 向标识符添加哈希 (#) 符号会将其转换为符号

print(#mysymbol);

输出:

Symbol("mysymbol")

2. 否则,可以使用 Class 构造函数显式创建符号。

Symbol mySymbol = Symbol('mysymbol');
print(mySymbol);

输出:

Symbol("mysymbol")

例子:

在本例中,我们将创建一个自定义库,然后使用符号显示其元数据。

在这里,我们首先创建了一个Dart文件自定义。 dart包含一个库custom_lib ,它由一个名为CustomClass的类组成,该类具有方法customFunction1customFunction2

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:coredart: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")