Programowanie w rzutki - symbol
Symbole w Dart to nieprzezroczyste, dynamiczne nazwy ciągów używane do odzwierciedlania metadanych z biblioteki. Mówiąc najprościej, symbole są sposobem przechowywania relacji między ciągiem czytelnym dla człowieka a ciągiem zoptymalizowanym pod kątem używania przez komputery.
Odbicie to mechanizm służący do uzyskiwania metadanych danego typu w czasie wykonywania, takich jak liczba metod w klasie, liczba posiadanych konstruktorów lub liczba parametrów funkcji. Możesz nawet wywołać metodę typu, który jest ładowany w czasie wykonywania.
W refleksji Dart dostępne są określone klasy w dart:mirrorspakiet. Ta biblioteka działa zarówno w aplikacjach internetowych, jak i aplikacjach wiersza poleceń.
Składnia
Symbol obj = new Symbol('name');
// expects a name of class or function or library to reflect
Plik name musi być poprawną publiczną nazwą członka Dart, publiczną nazwą konstruktora lub nazwą biblioteki.
Przykład
Rozważmy następujący przykład. Kod deklaruje klasęFoo w bibliotece foo_lib. Klasa definiuje metodym1, m2, i m3.
Foo.dart
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");
}
}
Następujący kod ładuje się Foo.dartbiblioteka i wyszukuje klasę Foo przy pomocy typu Symbol. Ponieważ odzwierciedlamy metadane z powyższej biblioteki, kod importujedart:mirrors biblioteka.
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;
}
}
Zauważ, że wiersz libMirror.declarations.forEach ((s, d) => print (s)); będzie iterował po każdej deklaracji w bibliotece w czasie wykonywania i wypisze deklaracje jako typSymbol.
Ten kod powinien dawać następujące efekty output -
Found Library
checkng...class details..
No of classes found is : 1
Symbol("Foo") // class name displayed as symbol
class found.
Przykład: wyświetl liczbę metod instancji klasy
Rozważmy teraz wyświetlenie liczby metod instancji w klasie. Predefiniowana klasaClassMirror pomaga nam to osiągnąć.
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));
}
}
Ten kod powinien dawać następujące efekty 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")
Konwertuj symbol na ciąg
Możesz przekonwertować nazwę typu, takiego jak klasa lub biblioteka, przechowywaną w symbolu z powrotem na ciąg przy użyciu MirrorSystemklasa. Poniższy kod pokazuje, jak przekonwertować symbol na ciąg.
import 'dart:mirrors';
void main(){
Symbol lib = new Symbol("foo_lib");
String name_of_lib = MirrorSystem.getName(lib);
print(lib);
print(name_of_lib);
}
Powinien dać następujący wynik output -
Symbol("foo_lib")
foo_lib