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