Dart-Programmierung - Symbol
Symbole in Dart sind undurchsichtige, dynamische Zeichenfolgennamen, die zum Reflektieren von Metadaten aus einer Bibliothek verwendet werden. Einfach ausgedrückt, Symbole sind eine Möglichkeit, die Beziehung zwischen einer von Menschen lesbaren Zeichenfolge und einer Zeichenfolge zu speichern, die für die Verwendung durch Computer optimiert ist.
Reflection ist ein Mechanismus zum Abrufen von Metadaten eines Typs zur Laufzeit, z. B. die Anzahl der Methoden in einer Klasse, die Anzahl der Konstruktoren oder die Anzahl der Parameter in einer Funktion. Sie können sogar eine Methode des Typs aufrufen, der zur Laufzeit geladen wird.
In Dart Reflection sind bestimmte Klassen in der verfügbar dart:mirrorsPaket. Diese Bibliothek funktioniert sowohl in Webanwendungen als auch in Befehlszeilenanwendungen.
Syntax
Symbol obj = new Symbol('name');
// expects a name of class or function or library to reflect
Das name muss ein gültiger öffentlicher Dart-Mitgliedsname, öffentlicher Konstruktorname oder Bibliotheksname sein.
Beispiel
Betrachten Sie das folgende Beispiel. Der Code deklariert eine KlasseFoo in einer Bibliothek foo_lib. Die Klasse definiert die Methodenm1, m2, und m3.
Lebensmittelkunst
library foo_lib;
// libarary name can be a symbol
class Foo {
// class name can be a symbol
m1() {
// method name can be a symbol
print("Inside m1");
}
m2() {
print("Inside m2");
}
m3() {
print("Inside m3");
}
}
Der folgende Code wird geladen Foo.dartBibliothek und sucht nach Foo-Klasse mit Hilfe des Symboltyps. Da wir die Metadaten aus der obigen Bibliothek widerspiegeln, wird der Code importiertdart:mirrors Bibliothek.
FooSymbol.dart
import 'dart:core';
import 'dart:mirrors';
import 'Foo.dart';
main() {
Symbol lib = new Symbol("foo_lib");
//library name stored as Symbol
Symbol clsToSearch = new Symbol("Foo");
// class name stored as Symbol
if(checkIf_classAvailableInlibrary(lib, clsToSearch))
// searches Foo class in foo_lib library
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;
}
}
Beachten Sie, dass die Zeile libMirror.declarations.forEach ((s, d) => print (s)); iteriert zur Laufzeit über jede Deklaration in der Bibliothek und druckt die Deklarationen als Typ vonSymbol.
Dieser Code sollte Folgendes erzeugen output - -
Found Library
checkng...class details..
No of classes found is : 1
Symbol("Foo") // class name displayed as symbol
class found.
Beispiel: Zeigen Sie die Anzahl der Instanzmethoden einer Klasse an
Betrachten wir nun die Anzahl der Instanzmethoden in einer Klasse. Die vordefinierte KlasseClassMirror hilft uns, dasselbe zu erreichen.
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));
}
}
Dieser Code sollte Folgendes erzeugen output - -
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")
Symbol in String konvertieren
Sie können den Namen eines Typs wie einer Klasse oder Bibliothek, die in einem Symbol gespeichert ist, mithilfe von in einen String zurückkonvertieren MirrorSystemKlasse. Der folgende Code zeigt, wie Sie ein Symbol in eine Zeichenfolge konvertieren können.
import 'dart:mirrors';
void main(){
Symbol lib = new Symbol("foo_lib");
String name_of_lib = MirrorSystem.getName(lib);
print(lib);
print(name_of_lib);
}
Es sollte Folgendes erzeugen output - -
Symbol("foo_lib")
foo_lib