Программирование дротиков - символ

Символы в Dart - это непрозрачное динамическое строковое имя, используемое для отображения метаданных из библиотеки. Проще говоря, символы - это способ сохранить связь между строкой, читаемой человеком, и строкой, оптимизированной для использования компьютерами.

Отражение - это механизм для получения метаданных типа во время выполнения, таких как количество методов в классе, количество конструкторов, которые он имеет, или количество параметров в функции. Вы даже можете вызвать метод того типа, который загружается во время выполнения.

В отражении Dart определенные классы доступны в dart:mirrorsпакет. Эта библиотека работает как в веб-приложениях, так и в приложениях командной строки.

Синтаксис

Symbol obj = new Symbol('name');  
// expects a name of class or function or library to reflect

В name должно быть действительным именем общедоступного члена Dart, именем общедоступного конструктора или именем библиотеки.

пример

Рассмотрим следующий пример. Код объявляет классFoo в библиотеке foo_lib. Класс определяет методыm1, m2, а также 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"); 
   } 
}

Следующий код загружает Foo.dartбиблиотека и ищет класс Foo с помощью типа Symbol. Поскольку мы отражаем метаданные из указанной выше библиотеки, код импортируетdart:mirrors библиотека.

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; 
   } 
}

Обратите внимание, что строка libMirror.declarations.forEach ((s, d) => print (s)); будет перебирать каждое объявление в библиотеке во время выполнения и печатать объявления как типSymbol.

Этот код должен дать следующее output -

Found Library 
checkng...class details.. 
No of classes found is : 1 
Symbol("Foo") // class name displayed as symbol  
class found.

Пример: отображение количества методов экземпляра класса

Давайте теперь рассмотрим отображение количества экземпляров методов в классе. Предопределенный классClassMirror помогает нам добиться того же.

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)); 
   } 
}

Этот код должен дать следующее 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")

Преобразовать символ в строку

Вы можете преобразовать имя типа, такого как класс или библиотека, хранящиеся в символе, обратно в строку, используя MirrorSystemкласс. В следующем коде показано, как преобразовать символ в строку.

import 'dart:mirrors'; 
void main(){ 
   Symbol lib = new Symbol("foo_lib"); 
   String name_of_lib = MirrorSystem.getName(lib); 
   
   print(lib); 
   print(name_of_lib); 
}

Должно получиться следующее output -

Symbol("foo_lib")   

foo_lib